人物のいない道のみの画像を背景画像にして、その場所を人物が歩行している動画と差分を取って人物のみを検出したいのですが、背景差分を取った出力の映像において人物が背景画像と合わさってしまいハッキリと人と認識することができません。
例としては横断歩道を渡っている人物を検出した時に、出力映像の人物が縞々になってしまう感じです。
人物をハッキリと認識できるように切り取るにはどのような方法を取ればよろしいでしょうか。
Windows7でVisual Studio 2010、OpenCV 2.4.9を使用しています。
以下、コードを記載します。宜しくお願いします。
#include "stdafx.h"
#include <opencv2/opencv.hpp> // OpenCVヘッダ
#pragma comment(lib,"opencv_imgproc249d.lib") // OpenCVライブラリ
#pragma comment(lib,"opencv_core249d.lib") // OpenCVライブラリ
#pragma comment(lib,"opencv_highgui249d.lib") // OpenCVライブラリ
int main()
{
//読み込む静止画像名
IplImage* sourceImage = cvLoadImage("base.jpg", CV_LOAD_IMAGE_ANYDEPTH|CV_LOAD_IMAGE_ANYCOLOR);
IplImage* differenceImage = NULL;
//読み込む動画ファイル名
char* filename="test.mp4";
//IplImage
IplImage* src;
CvCapture* capture = NULL;
int key; //キー入力
if(sourceImage == NULL ){
//画像が見つからない場合
printf("画像が見つかりません\n");
return -1;
}
//指定したファイルが見つからない場合
if(NULL==(capture = cvCaptureFromAVI(filename))){
fprintf(stderr,"指定のファイルが見つかりませんでした");
return -1;
}
//画像表示ウィンドウの準備
cvNamedWindow("出力", CV_WINDOW_AUTOSIZE);
//処理ループの開始
for(;;){
//AVIフtァイルからフレーム画像を取り出す
if(NULL==(src=cvQueryFrame(capture))){
break;
}
//処理画像を実体として定義
differenceImage = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3);
//背景差分処理
cvAbsDiff(src,sourceImage,differenceImage);
//画像表示
cvShowImage("出力", differenceImage);
cvReleaseImage(&differenceImage);
//キー入力
key = cvWaitKey(10);
//ESCキーを押すと終了
if(key==0x1b){
break;
}
}
//解放
cvReleaseCapture(&capture);
cvDestroyWindow("出力");
return 0;
}