ページ 11

opencvにおけるmat型の扱いに関して

Posted: 2016年7月17日(日) 13:36
by Ute
私は今opencvを使った画像処理に取り組んでいるものです.
opencvに関しては3ヶ月程度しか経験がありません.

先日プログラミング中にアクセス違反が発生してしまい、原因を探ってみたところ、
どうやらグローバル変数として宣言したmatポインタとimreadを組み合わせるとアクセス違反が出てしまうようです.....
アクセス違反が発生する理由と解決方法について何かアドバイスを頂けませんか?
環境はvs12、opencvのバージョンは2.4.9です.

コード:

//インクルードファイル指定
#include <opencv2/opencv.hpp>
//静的リンクライブラリの指定
#include <opencv2/opencv_lib.hpp>
cv::Mat *InputImage;
int main(){
/*main関数中のコメントアウトを外すとアクセス違反が発生する.*/
	cv::Mat m = cv::imread("ImageP.png");
	//*InputImage = m;
	cv::namedWindow("image", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
	//cv::imshow("image",*InputImage);
	cv::imshow("image",m);
	cv::waitKey(0);
	return 0;
}

Re: opencvにおけるmat型の扱いに関して

Posted: 2016年7月17日(日) 13:46
by みけCAT
InputImageは明示的に初期化されていない静的記憶期間を持つ変数なので、zero-initializeされてヌルポインタになります。
ヌルポインタをデリファレンスしてはいけません。
デリファレンスする前に有効な領域へのポインタを代入するか、このような自殺コードは必要なければ消すといいでしょう。
オフトピック
opencvは全く本質じゃないですね…
Ute さんが書きました:opencvに関しては3ヶ月程度しか経験がありません.
opencvに関して「は」とのことですが、C++自体の経験はどのくらいでしょうか?

Re: opencvにおけるmat型の扱いに関して

Posted: 2016年7月17日(日) 14:23
by ute
手早いご回答ありがとうございます.
うっかりしておりました、確かにこの場合なら以下の様に
コード変更するのが妥当ですね.失礼致しました.
cppの経験に関しては1年前後でしょうか....、流石に間抜けな質問過ぎましたね....

コード:

//インクルードファイル指定
#include <opencv2/opencv.hpp>
//静的リンクライブラリの指定
#include <opencv2/opencv_lib.hpp>
cv::Mat *InputImage;
int main(){
	cv::Mat m = cv::imread("ImageP.png");
	InputImage = &m;
	cv::namedWindow("image", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
	cv::imshow("image",*InputImage);

	cv::waitKey(0);
	return 0;
}