ここから本文です

DirectShowでカメラキャプチャし、OpenCVで画像処理をするという手順を部分的に関...

noz********さん

2017/6/1717:00:05

DirectShowでカメラキャプチャし、OpenCVで画像処理をするという手順を部分的に関数化したいと思うのですが、なかなかうまくいきません。皆様のご意見を頂ければ幸いです。

まず、参考サイト(http://wikiwiki.jp/masayashi/?OpenCV%2FDirectShow%A4%C7%A5%AD%A5%E3...
)に倣って、DirectShow.hなどをインクルードし、
その上で以下のコードでうまく実行できていることが確認されました。
(開発環境 VC++ 2013, OpenCV 2.4.9)
_____________________

#include <opencv2/opencv.hpp>
#include <opencv2/opencv_lib.hpp>
#include <opencv\cv.h> //OpenCV
#include <opencv\cxcore.h> //OpenCV
#include <opencv\highgui.h> //OpenCV
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <math.h>
#include <iostream>//
#include <ctype.h>//
#include "DirectShow.h"

#define CAPTURE_SIZE_X 320
#define CAPTURE_SIZE_Y 240

using namespace std;
using namespace cv;

int main()
{
//DirectShowクラスを生成
DirectShow capture(CAPTURE_SIZE_X, CAPTURE_SIZE_Y, 2);

Mat img;

while (1) {
img = capture.capture();
int c = cvWaitKey(20);
imshow("img", img);
}
}

_____________________


次に、whileループ内の処理を以下のように関数化(void capt)してみました。


_____________________

#include <opencv2/opencv.hpp>
#include <opencv2/opencv_lib.hpp>
#include <opencv\cv.h> //OpenCV
#include <opencv\cxcore.h> //OpenCV
#include <opencv\highgui.h> //OpenCV
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <math.h>
#include <iostream>//
#include <ctype.h>//
#include "DirectShow.h"

#define CAPTURE_SIZE_X 320
#define CAPTURE_SIZE_Y 240

using namespace std;
using namespace cv;

void capt(Mat img, DirectShow capture);

int main()
{
//DirectShowクラスを生成
DirectShow capture(CAPTURE_SIZE_X, CAPTURE_SIZE_Y, 2);

Mat img;

while (1) {
capt(img, capture);
}
}

void capt(Mat img, DirectShow capture){
img = capture.capture();
int c = cvWaitKey(20);
imshow("img", img);
}
_____________________

実行した結果、最初の1フレームだけキャプチャ&表示できるものの、以後はエラーとなります。

エラーメッセージは以下の通りです。
_____________________

OpenCV Error: Assertion failed ((((img) != 0 && ((const IplImage*)(img))->nSize
== sizeof(IplImage)) && ((IplImage*)img)->imageData != 0) && img->imageData != 0
) in cv::Mat::Mat, file C:\builds\2_4_PackSlave-win32-vc12-shared\opencv\modules
\core\src\matrix.cpp, line 475
_____________________

見苦しくて恐縮ですが、解決に向けてご助言などいただければ大変助かります。
何卒よろしくお願いいたします。

閲覧数:
469
回答数:
1
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

buy********さん

2017/6/1719:23:11

>
nozo009さん

動画って静止画の連続なので
まず動画取り込みの部分を
動画取り込み開始から5枚とか3枚とかの静止画取りこみ
およびPngファイルへの書きだし処理にします

それができたら、今度はPNGファイルにたいして
OpenCVでやりたい処理をやらすプログラム書いて

動作が上手くいったら、ソースそれぞれバックアップ

それができてから、連携するようにプログラム書くのが良いと思う


***その他
静止画のサイズとかが違ってるメッセージでてるので
取りこんだ動画の静止画の特性(色深さとかサイズとか)
を標準出力に出力するようにして
確認した方が良いと思う

動画取りこみ開始から3枚の動画を
OpenCVの関数つかって表示するとかも良い確認方法だと思う

***他人にたよるまえに
頭ちょっとは使って工夫しましょう
デバッガ使うのも良い方法だよ

この回答は投票によってベストアンサーに選ばれました!

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる