🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
OpenCV

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

C++

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

Q&A

解決済

1回答

2551閲覧

膨張、収縮フィルタの使い方がわかりません

nasu_nasu

総合スコア7

OpenCV

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

C++

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

0グッド

1クリップ

投稿2019/11/24 15:23

前提・実現したいこと

OpenCVを今勉強中の初心者なのですが、画像に膨張、収縮フィルタを使用するとエラーが起こります。
キー入力で、dを入力すると膨張、eを押すと収縮するようにしたいのですがどうしたら良いでしょうか?

発生している問題・エラーメッセージ

OpenCV: terminate handler is called! The last OpenCV error is: OpenCV(4.1.0) Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow, file C:\build\master_winpack-build-win64-vc14\opencv\modules\highgui\src\window.cpp, line 352

該当のソースコード

C++

1while (true) 2 { 3 4 switch (cv::waitKey(33)) 5 { 6 case 'd': 7 cv::dilate(clone, cstring, cv::Mat()); 8 cout << "膨張" << endl; 9 break; 10 case 'e': 11 cv::erode(clone, cstring, cv::Mat()); 12 cout << "収縮" << endl; 13 break; 14 case 's': 15 cv::imwrite("cstring.jpg",cstring); 16 case 'q': 17 return; 18 } 19 cv::imshow("Input", clone); 20 cv::imshow("Cstring", cstring); 21 }

試したこと

正直、フィルタの使い方がわからないので、いろいろな書き方を試してみましたが、どれも同じエラーになりました。
buildはできるのですが、コマンドプロンプトで起動するとエラーになります。

補足情報(FW/ツールのバージョンなど)

OpenCVは1.40.1を使用しています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

想像ですが,あなたがキーを押すよりも前に
cv::waitKey(33)に指定した時間(33ms)が過ぎてしまい,dilateやerodeを実行せずに
cv::imshow("Cstring", cstring);に処理が達してしまうのではないでしょうか.
で,その状態では cstring が空であるためにエラーが起こっているのだと思います.

  • 原因がこのことであるのか否かを確認するために,一度,cv::waitKey()の引数を0にして試してみたらどうでしょう.
  • このことが原因である場合,キーを押さずとも時間経過で処理を進める必要があるならば, if( !cstring.emtpy() ){ cv::imshow( "Cstring", cstring ); } のようにして,画像が空である場合は表示しないようにするとか,あるいは,あらかじめcstringを適当なサイズで生成しておく等すればよいのではないでしょうか.

投稿2019/11/25 01:15

編集2019/11/25 01:17
fana

総合スコア11990

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

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

nasu_nasu

2019/11/25 07:51

cstringにclone(元画像)を代入したところ、動きました。fanaさんの言う通り、cstringが空っぽの状態だったようです。 質問することが初めてだったので載せた情報が少ない質問ですみません。本当にありがとうございました!! 一応、ソースコードをすべて載せておきます↓ #include <opencv2/opencv.hpp> #include <iostream> using namespace std; void morpho(char* fileName) { cv::Mat image = cv::imread(fileName); if (image.empty()){ std::cout << "画像読み込み失敗" << std::endl; return; } cv::Mat cstring; cv::Mat clone = image.clone(); cstring = clone; while (true) { switch (cv::waitKey(33)) { case 'd': cv::dilate(clone, cstring, cv::Mat(), cv::Point(-1, -1), 1); cout << "膨張" << endl; break; case 'e': cv::erode(clone, cstring, cv::Mat(), cv::Point(-1, -1), 1); cout << "収縮" << endl; break; case 'r': cstring = image.clone(); break; case 's': cv::imwrite("cstring.jpg",cstring); case 'q': return; } cv::imshow("Input", image); cv::imshow("Cstring", cstring); } } int main(int argc, char* argv[]) { if (argc < 2) morpho("bstring.jpg"); //default画像 else morpho(argv[1]); return 0; }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問