前提・実現したいこと
https://github.com/opencv/opencv_contrib/blob/master/modules/saliency/samples/computeSaliency.cpp
上記のサイトにて公開されているソースコードを参考に質問させていただきます.
OpenCv_contrib に含まれている saliency の BinWangApr2014 を用い, 動画データを顕著性マップにかけようと試みたのですが, 出力結果が真っ黒になってしまい上手く出力されません.
デバックして調べたところ動画データの読み込みは確認できたのですが, 動画の顕著性の処理( computeSaliency )を施すと, 1フレームごとに出力される Mat データのピクセル全てが1(同一)になってしまい, その結果同一色(真っ黒)になってしまうことが判明しました.正規化の値を50に設定すると出力結果の画面は全て灰色になります.
この解決方法がわかる方は, 是非ご教授お願いいたします.
試したこと
画像の顕著性マップ(SPECTRAL_RESIDUAL, FINE_GRAINED)は出力に成功していたので, update関数内のBinWangApr2014での処理を画像の顕著性マップ(SPECTRAL_RESIDUAL, FINE_GRAINED)の処理に置き換えたところ, 顕著性マップが施された動画が出力されました.
となると BinWangApr2014 の根本的な問題なのでしょうか...
ソースコード
C++
1#pragma once 2 3#include "ofMain.h" 4#include "ofxOpenCv.h" 5#include "ofxCv.h" 6#include "saliencySpecializedClasses.hpp" 7#include "opencv2/highgui.hpp" 8#include <iostream> 9#include "opencv2/core/core.hpp" 10 11using namespace std; 12using namespace cv; 13using namespace saliency; 14 15class ofApp : public ofBaseApp { 16 17public: 18 void setup(); 19 void update(); 20 void draw(); 21 22// 省略 23 24 // 動画 25 ofVideoPlayer player; 26 27 // 出力データ(白黒動画) 28 ofImage outputOfImg4; 29 30 // 顕著性マップ 31 Mat saliencyMap_BinWangApr2014, saliencyMap_BinWangApr2014_2; 32 // 出力される顕著性マップ 33 Mat saliencyMap_BinWangApr2014_3; 34 35 // BinWangApr2014(顕著性マップを求めるアルゴリズム : 動画) 36 Ptr<MotionSaliencyBinWangApr2014> saliencyAlgorithm_BinWangApr2014 = MotionSaliencyBinWangApr2014::create(); 37};
C++
1#include "ofApp.h" 2 3//-------------------------------------------------------------- 4void ofApp::setup(){ 5 6 // 動画の読み込み 7 ofBackground(255,255,255); 8 ofSetVerticalSync(true); 9 player.load("test.mp4"); 10 player.play(); 11 12 // 顕著性マップ(BinWangApr2014)の設定 13 ofPixelsRef p = player.getPixels(); 14 Mat m = ofxCv::toCv(p).clone(); 15 16 saliencyAlgorithm_BinWangApr2014.dynamicCast<MotionSaliencyBinWangApr2014>()->setImagesize( m.cols, m.rows ); 17 saliencyAlgorithm_BinWangApr2014.dynamicCast<MotionSaliencyBinWangApr2014>()->init(); 18 19 ofLog()<<"m_cols : "<<m.cols; 20 ofLog()<<"m_rows : "<<m.rows; 21} 22 23//-------------------------------------------------------------- 24void ofApp::update(){ 25 player.update(); 26 27 if(player.isFrameNew()){ 28 // 1フレームを取得 29 ofPixelsRef pix = player.getPixels(); 30 // Mat変換 31 Mat mat = ofxCv::toCv(pix).clone(); 32 // 白黒加工 33 cvtColor( mat, mat, COLOR_BGR2GRAY ); 34 // 画像(ofImage)に変換 : 動いているのを確認 35 ofxCv::toOf( mat, outputOfImg4 ); 36 outputOfImg4.update(); 37 38 // 顕著性マップ(BinWangApr2014)に変換 : 1フレームごとに出力されるMatデータのピクセル全てが1(同一)になってしまい, 39 saliencyAlgorithm_BinWangApr2014->computeSaliency( mat.clone(), saliencyMap_BinWangApr2014 ); 40 41 ofLog()<<"saliencyMap_BinWangApr2014_cols : "<<saliencyMap_BinWangApr2014.cols; 42 ofLog()<<"saliencyMap_BinWangApr2014_rows : "<<saliencyMap_BinWangApr2014.rows; 43 ofLog()<<"saliencyMap_BinWangApr2014_type : "<< saliencyMap_BinWangApr2014.type(); 44 ofLog()<<"BinWangApr2014_at : "<<(int)saliencyMap_BinWangApr2014.at<uchar>(0,0); 45 46 // アルファチャンネルの正規化を行う 47 normalize( saliencyMap_BinWangApr2014.clone(), saliencyMap_BinWangApr2014_2, 0.0, 255.0, NORM_MINMAX); 48 49 ofLog()<<"正規化 : "<<(int)saliencyMap_BinWangApr2014_2.at<uchar>(0,0); 50 51 // Matの型(ビット深度)を変換する 52 saliencyMap_BinWangApr2014_2.convertTo( saliencyMap_BinWangApr2014_3, CV_8UC3 ); 53 ofLog()<<"Matの型 : "<<(double)saliencyMap_BinWangApr2014_3.at<double>(0,0); 54 55 } 56} 57 58//-------------------------------------------------------------- 59void ofApp::draw(){ 60 61 // 出力(動画) 62 player.draw(0, 300, 300, 200); 63 outputOfImg4.draw( 300, 300, 300, 200 ); 64 65 // 顕著性マップ(BinWangApr2014)を出力 66 ofxCv::drawMat(saliencyMap_BinWangApr2014_3, 600, 300, 300, 200); 67 // FPS出力 68 ofDrawBitmapStringHighlight(ofToString(ofGetFrameRate()), 20, 20); 69} 70
出力結果
[notice ] saliencyMap_BinWangApr2014_cols : 1280 [notice ] saliencyMap_BinWangApr2014_rows : 720 [notice ] saliencyMap_BinWangApr2014_type : 0 [notice ] BinWangApr2014_at : 1 [notice ] 正規化 : 0 [notice ] Matの型 : 0
補足情報(FW/ツールのバージョンなど)
MacbookPro 10.13.5
macOS HighSierra
CMake 3.10.0-rc5
openFrameworks pre release v0.9.8
Xcode 9.3
openCv_4.3.2, openCv-contrib_4.3.2
あなたの回答
tips
プレビュー