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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

OpenCV

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

Q&A

解決済

1回答

23868閲覧

OpenCV Error: Assertion failed が発生したりしなかったりします

tak__tak

総合スコア78

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

OpenCV

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

0グッド

0クリップ

投稿2018/10/04 03:04

visual studio 2017 version 15.8.4で
opencv3.1.0の関数を利用する時に
Assertion failed が起きたり起きなかったりするのですが
どうしてこれが発生するのでしょうか?
この問題を解消するためにはどうしたら良いのでしょうか?

Mat型の引数を持つ関数
cvtColor split merge imwrite 
などを呼ぶ時に発生します。

Mat image = imread("image.jpg" , IMREAD_UNCHANGED);
Mat a = function( image );
imwrite( "output.jpg" , a );

 

Mat function( Mat image ){
Mat hsv_image , conv_image ;
Mat channels[3];
cvtColor( image , hsv_image , CV_RGB2HSV );
split(hsv_image, channels);
merge(channels, 3, hsv_image);
cvtColor( hsv_image, conv_image , CV_HSV2RGB);
return conv_image;
}

cvtColor split merge imwrite を呼ぶ時にエラーが発生したりしなかったりします。
エラーメッセージはこちらです。
これが、必ず発生する訳ではなく、順番によって起きたり起きなかったりするのです

OpenCV Error: Assertion failed ((scn == 3 || scn == 4) && (depth == CV_8U || depth == CV_32F)) in cv::ipp_cvtColor,
file opencv-3.1.0\modules\imgproc\src\color.cpp, line 7646

また、return 文で停止したりもします。
デバッグで確かめると、Mat変数について、ヒープが壊れていますのメッセージが
出たり出なかったりするのです

画像自体はどれも問題ない画像ファイルです。

Matで画像を配列で用意してfunctionを呼ぶと起きなかったり、配列の数によっては起きたりと言った事が
なぜこの問題が生じるのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

いくつか考えられる可能性

  • パスが間違っていて、画像の読み込みに失敗している。
  • 読み込んだ画像が3チャンネルでない (質問の function() 内の split、merge は画像が3チャンネルを前提とした書き方になっている。)

以下の修正を加えたサンプルコードを記載しておきます。

  • 画像の読み込みに失敗した場合は、プログラムを終了する。
  • 任意のチャンネル数で split()、merge() を使えるようにする。
  • unsing namespace cv; は使わない。(名前空間が汚染されるので、using namespace はやめたほうがいいです。)
  • cv::COLOR_RGB2HSV、cv::COLOR_HSV2RGB でなく、cv::COLOR_BGR2HSV、cv::COLOR_HSV2BGR を使う。OpenCV では画像のチャンネルの並び順はRGBでなく、BGRとして扱われます。

cpp

1#include <iostream> 2#include <vector> 3 4#include <opencv2/opencv.hpp> 5 6void function(const cv::Mat &image, cv::Mat &dst) 7{ 8 // BGR -> HSV 9 cv::Mat hsv; 10 cv::cvtColor(image, hsv, cv::COLOR_BGR2HSV); 11 12 // チャンネルごとに分割する。 13 std::vector<cv::Mat> channels; 14 cv::split(hsv, channels); 15 16 // チャンネルをマージする。 17 cv::Mat merged; 18 cv::merge(channels, merged); 19 20 // HSV -> BGR 21 cv::cvtColor(merged, dst, cv::COLOR_HSV2BGR); 22} 23 24int main(void) 25{ 26 // 画像を読み込む。 27 cv::Mat image = cv::imread( 28 R"(image.jpg)", cv::IMREAD_UNCHANGED); 29 if (image.empty()) { 30 std::cout << "failed to load image." << std::endl; 31 return 1; 32 } 33 34 cv::Mat dst; 35 function(image, dst); 36 37 // 画像を書き込む。 38 cv::imwrite(R"(output.jpg)", dst); 39}

投稿2018/10/04 03:30

編集2018/10/04 03:35
tiitoi

総合スコア21956

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

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

tak__tak

2018/10/05 06:14

このコードで実行しましたがimage.empty() がtrueにはなりません。 このコードだと cv::split で停止します。 デバッガの方では ハンドルされない例外が 0x00007FFC3076A388 で発生しました (function.exe 内): Microsoft C++ の例外: cv::Exception (メモリの場所 0x0000000E8D2FCA30)。 となり コンソールの方には OpenCV Error: Assertion failed ((scn == 3 || scn == 4) && (depth == CV_8U || depth == CV_32F)) in cv::cvtColor, file opencv-3.1.0\modules\imgproc\src\color.cpp, line 8141 と出力されます。
tiitoi

2018/10/05 06:26

画像の読み込みに失敗した場合、image.empty() == true になるので、画像が読み込めたのなら、image.empty() == false になるのは正しい動作です。 そして画像が正しく読み込めたのなら、上記のような例外が発生する現象はこちらでは確認できません。 以下で画像サイズとチャンネル数がどうなっているか見てみてください。3チャンネルまたは4チャンネルの画像となっていますか? ``` std::cout << "image.size(): " << image.size() << std::endl; std::cout << "image.channels(): " << image.channels() << std::endl; ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問