質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
CMake

CMakeはクロスプラットフォームで作動するオープンソースのビルドシステムです。コマンドライン又は組み込まれた開発環境で使うことができる元のmakefileとプロジェクトファイルを生成します。

openFrameworks

openFrameworksは、C++で記述されたライブラリ群です。既存のライブラリの設定なしで使用できるため「糊」のようなツールキットと呼ばれています。簡単なコードだけで様々なグラフィックスやインタラクションをデザインすることが可能です。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

3357閲覧

cvMinMaxLocを用い, 動画の値の最大,最小値,およびその位置をリアルタイムで取り出したい

ks-cap

総合スコア22

CMake

CMakeはクロスプラットフォームで作動するオープンソースのビルドシステムです。コマンドライン又は組み込まれた開発環境で使うことができる元のmakefileとプロジェクトファイルを生成します。

openFrameworks

openFrameworksは、C++で記述されたライブラリ群です。既存のライブラリの設定なしで使用できるため「糊」のようなツールキットと呼ばれています。簡単なコードだけで様々なグラフィックスやインタラクションをデザインすることが可能です。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/07/19 12:44

編集2018/07/19 15:25

前提・実現したいこと

関数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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

C言語版APIのcvMinMaxLocではなく、C++版のminMaxLocを使うのがいいのではないでしょうか。

投稿2018/07/19 23:32

kazto

総合スコア7196

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ks-cap

2018/07/20 03:50 編集

回答のほどありがとうございます. ご指摘通りminMaxLocを利用すると無事出力されました. ご教授のほどありがとうございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問