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

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

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

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

C++

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

Q&A

解決済

2回答

3604閲覧

OpenCVのc++で背景差分

17546

総合スコア1

OpenCV

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

C++

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

0グッド

0クリップ

投稿2021/10/04 03:15

編集2021/10/04 05:55

前提・実現したいこと

opencvのc++で背景差分をしたいのですが,エラーが発生してしまい先に進むことができません。
対処する方法を教えていただけないでしょうか。

補足
OS:Windows10
OpenCVのバージョン:4.5.3

41行目でabortします。

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

abort() has been called デバッグの開始をした際 ハンドルされない例外が 0x00007FFF0CB24ED9 で発生しました

該当のソースコード

#include <opencv2/highgui/highgui.hpp> #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <stdio.h> #include <stdlib.h> #include <time.h> using namespace std; //閾値(threshold)の設定 static const int th = 30; int main(void) { //カメラを開く cv::VideoCapture video1(0); //動画の読み込み //変数の準備 cv::Mat im1, im2, frame1; cv::Mat diff; cv::Mat immask, mask; cv::Mat image = cv::imread("C:/Users/s17546/Desktop/1.jpg"); if (image.empty() == true) { // 画像の中身が空なら終了する return 0; } //ウィンドウを2枚生成 cv::namedWindow("in"); cv::namedWindow("out"); cv::cvtColor(image, im1, cv::COLOR_BGR2GRAY); while (1) { video1.read(frame1); cv::cvtColor(frame1, im2, cv::COLOR_BGR2GRAY); cv::absdiff(im2, im1, diff); //差分diffのうち、閾値thを超えている部分を1、それ以外を0としてmaskに出力 cv::threshold(diff, mask, 5, 1, cv::THRESH_BINARY); //マスクmaskのうち、1(True)の部分を白(0)に、0(False)の部分を黒(255)にしてim_maskに出力 cv::threshold(mask, immask, 0, 255, cv::THRESH_BINARY); //メディアンフィルタを使った平滑化によってゴマ塩ノイズを除去、アパーチャサイズ5 cv::medianBlur(immask, immask, 5); //ウィンドウ2枚にそれぞれ入力画像、差分画像を表示 cv::imshow("in", im2); cv::imshow("out", immask); //ウィンドウ上でEscキーが押されたらプログラム終了 if (cv::waitKey(27) >= 0) { cv::destroyAllWindows(); break; } } }

試したことード

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

jbpb0

2021/10/04 04:14

OSは何でしょうか? OpenCVのバージョンはいくつでしょうか?
yominet

2021/10/04 05:46

開発環境の情報もあるといいですね。 ブレイク・ステップ動作が使える環境であれば、 何行目でabortするのかを調べてみてはいかかがでしょうか? それはそうと、ファイル読み込みは成否確認してますが 同様にVIDEOからのframe1の中身は確認した方がいいと思います
17546

2021/10/04 06:00

修正しました。 よろしくお願いします。 また、frame1の中身を確認しましたが、異常はありませんでした。
jbpb0

2021/10/04 06:01

> cv::absdiff(im2, im1, diff); 「im2」と「im1」は同じサイズである必要があります http://opencv.jp/opencv-2svn/cpp/operations_on_arrays.html#cv-absdiff すなわち、「C:/Users/s17546/Desktop/1.jpg」と、カメラの動画データ(frame1)のサイズ(縦横の画素数)が同じである必要がありますが、そこは大丈夫でしょうか?
jbpb0

2021/10/04 06:05 編集

> 41行目でabortします。 コードのどの行かを教えてください > cv::absdiff(im2, im1, diff); ですか?
17546

2021/10/04 06:14

cv::absdiff(im2, im1, diff);の行です。 また、jpgのサイズを2.2k、1080p、720pと同等のサイズで試してみましたが、できませんでした。
jbpb0

2021/10/04 06:32 編集

> cv::absdiff(im2, im1, diff);の行です。 その行のすぐ上に cv::resize(im2, im2, im1.size(), cv::INTER_NEAREST); を追加したら、im2はim1と全く同じサイズになり、サイズの相違は無くなるので、 > 画像サイズをWVGAにしたところ、動作しました。 とかしなくても、エラー消えると思います
guest

回答2

0

「im2」と「im1」は同じサイズである必要があります
cv::absdiff

下記の変更をすれば「im2」は「im1」と全く同じサイズになり、サイズの相違が無くなるのでエラー出なくなると思います

python

1 cv::absdiff(im2, im1, diff);

↓ 「resize」追加

python

1 cv::resize(im2, im2, im1.size(), cv::INTER_NEAREST); 2 cv::absdiff(im2, im1, diff);

投稿2021/10/12 08:59

編集2021/10/12 09:00
jbpb0

総合スコア7653

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

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

17546

2021/10/12 10:05

ありがとうございます。 参考にさせていただきます。
guest

0

自己解決

画像サイズをWVGAにしたところ、動作しました。
ここまで付き合ってくれた皆様、ありがとうございました。

投稿2021/10/04 06:18

17546

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問