前提・実現したいこと
関数cvMinMaxLoc()を用い, 動画中の値の最大,最小値,およびその位置をリアルタイムで取り出したいのですがエラーが発生してしまいうまくできません.
分かる方がいらっしゃいましたらご教授いただけると幸いです.
追記
顕著性を算出するためupdate内で処理を行なっています.
下記の処理(cvMinMaxLoc)以外は正常に作動していることを確認しています.
cvMinMaxLoc( &saliencyMap_conv, &min_val, &max_val, &min_loc, &max_loc, NULL );
発生している問題・エラーメッセージ
2018-07-19 21:34:53.688021+0900 saliency-drive[16457:5455166] AVD info: codecHALEnableHEVCDecoder = 1 2018-07-19 21:34:53.694294+0900 saliency-drive[16457:5455166] video loaded at 1280 x 720 @ 29.970030 fps 2018-07-19 21:34:53.883520+0900 saliency-drive[16457:5455236] AVD info: codecHALEnableHEVCDecoder = 1 2018-07-19 21:34:53.894466+0900 saliency-drive[16457:5455165] [] <<<< FigBufferedAirPlayClientRoutingRegistry >>>> FigBufferedAirPlayClientRoutingRegistryCreate: FigBufferedAirPlayClientRoutingRegistry created OpenCV(3.4.2) Error: Bad argument (Unknown array type) in cvarrToMat, file /Users/username/OpenCV/opencv-3.4.2/modules/core/src/matrix_c.cpp, line 181 libc++abi.dylib: terminating with uncaught exception of type cv::Exception: OpenCV(3.4.2) /Users/username/OpenCV/opencv-3.4.2/modules/core/src/matrix_c.cpp:181: error: (-5:Bad argument) Unknown array type in function 'cvarrToMat'
該当のソースコード
C++
1#include "ofApp.h" 2 3//-------------------------------------------------------------- 4void ofApp::setup(){ 5 // 動画の読み込み 6 ofBackground( 255,255,255 ); 7 ofSetVerticalSync( true ); 8 player.load( "test.mp4" ); 9 player.play(); 10 11} 12 13//-------------------------------------------------------------- 14void ofApp::update(){ 15 player.update(); 16 17 if(player.isFrameNew()){ 18 // Mat変換 19 Mat mat = ofxCv::toCv( player ).clone(); 20 // 白黒加工 21 cvtColor( mat, mat, COLOR_BGR2GRAY ); 22 23 // // 顕著性マップ(SPECTRAL_RESIDUAL)に変換 24 saliencyAlgorithm_SPECTRAL_RESIDUAL->computeSaliency( mat.clone(), saliencyMap ); 25 // ofLog()<<"saliencyMap_SPECTRAL_RESIDUAL_at : "<<(int)saliencyMap_SPECTRAL_RESIDUAL.at<uchar>( 0, 0 ); 26 27 // アルファチャンネルの正規化を行う 28 normalize( saliencyMap.clone(), saliencyMap_norm, 0.0, 255.0, NORM_MINMAX ); 29 // ofLog()<<"正規化 : "<<(int)saliencyMap_norm.at<uchar>( 0, 0 ); 30 31 // Matの型(ビット深度)を変換する 32 saliencyMap_norm.convertTo( saliencyMap_conv, CV_8UC3 ); 33 // ofLog()<<"Mat_type : "<<(double)saliencyMap_SPECTRAL_RESIDUAL_conv.at<double>( 0, 0 ); 34 35 cvMinMaxLoc( &saliencyMap_conv, &min_val, &max_val, &min_loc, &max_loc, NULL ); 36 37 ofLog()<<"max_location[x] : "<<max_loc.x; 38 ofLog()<<"max_location[y] : "<<max_loc.y; 39 40 // 疑似カラー(カラーマップ)変換 41 applyColorMap( saliencyMap_conv.clone(), saliencyMap_color, COLORMAP_JET ); 42 43 } 44} 45 46//-------------------------------------------------------------- 47void ofApp::draw(){ 48 // 顕著性マップ(SPECTRAL_RESIDUAL:カラーマップ)を出力 49 ofxCv::drawMat( saliencyMap_color, 0, 0 ); 50 // FPS表示 51 ofDrawBitmapStringHighlight( ofToString(ofGetFrameRate()), 20, 20 ); 52} 53
C++
1#pragma once 2 3#include "ofMain.h" 4#include "ofxOpenCv.h" 5#include "ofxCv.h" 6#include "ofxGui.h" 7#include "saliencySpecializedClasses.hpp" 8#include "opencv2/highgui.hpp" 9#include "opencv2/core/core.hpp" 10#include "iostream" 11 12using namespace std; 13using namespace cv; 14using namespace saliency; 15 16class ofApp : public ofBaseApp{ 17 18public: 19 void setup(); 20 void update(); 21 void draw(); 22 23 // 動画 24 ofVideoPlayer player; 25 26 // cvMinMaxLocで使用 27 CvPoint min_loc, max_loc; 28 double min_val, max_val; 29 30 // 出力データ(SPECTRAL_RESIDUAL) 31 ofImage outputOfImg; 32 33 // 顕著性マップ 34 Mat saliencyMap, saliencyMap_norm, saliencyMap_conv, saliencyMap_color; 35 36 // SPECTRAL_RESIDUAL(顕著性マップを求めるアルゴリズム : 画像) 37 Ptr<StaticSaliencySpectralResidual> saliencyAlgorithm_SPECTRAL_RESIDUAL = StaticSaliencySpectralResidual::create(); 38 39};
補足情報(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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/20 03:50 編集