前提・実現したいこと
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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
OSは何でしょうか?
OpenCVのバージョンはいくつでしょうか?
開発環境の情報もあるといいですね。
ブレイク・ステップ動作が使える環境であれば、
何行目でabortするのかを調べてみてはいかかがでしょうか?
それはそうと、ファイル読み込みは成否確認してますが
同様にVIDEOからのframe1の中身は確認した方がいいと思います
修正しました。
よろしくお願いします。
また、frame1の中身を確認しましたが、異常はありませんでした。
> 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)のサイズ(縦横の画素数)が同じである必要がありますが、そこは大丈夫でしょうか?
> 41行目でabortします。
コードのどの行かを教えてください
> cv::absdiff(im2, im1, diff);
ですか?
cv::absdiff(im2, im1, diff);の行です。
また、jpgのサイズを2.2k、1080p、720pと同等のサイズで試してみましたが、できませんでした。
> cv::absdiff(im2, im1, diff);の行です。
その行のすぐ上に
cv::resize(im2, im2, im1.size(), cv::INTER_NEAREST);
を追加したら、im2はim1と全く同じサイズになり、サイズの相違は無くなるので、
> 画像サイズをWVGAにしたところ、動作しました。
とかしなくても、エラー消えると思います
回答2件
あなたの回答
tips
プレビュー