2009年6月10日 星期三

HW8-視訊webcam之應用

#include
#include
#include

#define x1 0
#define y1 0
#define alpha 0.5


int main()
{
CvCapture *capture;
IplImage *frame;
IplImage *frame1;
IplImage *frame3;
IplImage *gray;
IplImage *cgray;
IplImage *pgray;
IplImage *background1;
IplImage *background2;
IplImage *difference1;
IplImage *difference2;
IplImage* logoImg = NULL;

capture=cvCreateCameraCapture(0);
cvNamedWindow("Webcam",1);
cvNamedWindow("Webcam1",1);
cvNamedWindow("Webcam2",1);
//cvNamedWindow("Webcam3",1);

CvVideoWriter *writer;
char AviFileName[]="Output.avi";
int AviForamt = -1;
int FPS = 25;
CvSize AviSize = cvSize(640,480);
int AviColor = 1;
writer=cvCreateVideoWriter(AviFileName,AviForamt,FPS,AviSize,AviColor);

frame1 = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 3);
frame3 = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 3);
gray = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1);
cgray = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1);
background1 = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1);
background2 = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1);
difference1 = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1);
difference2 = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1);

logoImg=cvLoadImage("logo.jpg");

frame = cvQueryFrame(capture);
cvFlip( frame, 0, 1);
cvCvtColor(frame, background1, CV_BGR2GRAY);
background2=cvCloneImage(background1);
int i=0;
while(true)
{
frame = cvQueryFrame(capture);

cvFlip( frame, 0, 1);
cvCvtColor(frame, cgray, CV_BGR2GRAY);
cvAbsDiff(cgray, background1, difference1);
cvFlip( difference1, 0, 0);
cvThreshold(difference1,difference1,50,255,CV_THRESH_BINARY);

cvAbsDiff(cgray, background2, difference2);
cvFlip( difference2, 0, 0);
cvThreshold(difference2,difference2, 50,255,CV_THRESH_BINARY);
background2=cvCloneImage(cgray);

/*
for (int y=0; yheight; y++) {
uchar* ptr1=(uchar*) (logoImg->imageData +y*logoImg->widthStep);
uchar* ptr2=(uchar*) (frame->imageData +(y+y1)*frame->widthStep);
for (int x=0; xwidth; x++) {
ptr2[3*(x+x1)]=alpha*ptr1[3*(x+x1)] + (1-alpha)*ptr2[3*(x+x1)];
ptr2[3*(x+x1)+1]=alpha*ptr1[3*(x+x1)+1] + (1-alpha)*ptr2[3*(x+x1)+1];
ptr2[3*(x+x1)+2]=alpha*ptr1[3*(x+x1)+2] + (1-alpha)*ptr2[3*(x+x1)+2];
}
}

*/

//cvWriteFrame(writer,frame);

cvShowImage("Webcam",frame);
cvShowImage("Webcam1",difference1);
cvShowImage("Webcam2",difference2);


if(cvWaitKey(100)>0) break;
i++;
}

cvReleaseCapture(&capture);
// cvReleaseVideoWriter(&writer);
cvDestroyWindow("Webcam");
cvDestroyWindow("Webcam1");
//cvDestroyWindow("Webcam2");
//cvDestroyWindow("Webcam3");
}

1 則留言:

  1. 我已經可以開出視訊了,上課的時候以為是因為電腦有裝兩台視訊的關係造成我無法順利開出視訊來
    所以我有找一些資料來看,OpenCV要使用兩台以上的視訊要利用VFW,網路上也有寫好的範例程式,我也試著用用看,發現是OK的,而且只偵測到一台有在使用的視訊,因此我覺得老師的這個範例我應該是可以執行的。
    花了一些時間把行指令槓起來在打開來跑跑看,終於發現問題出在cvCvtColor(frame, background1, CV_BGR2GRAY);
    為什麼會有問題呢? 我一開始以為是出錯在CV_BGR2GRAY這裡,因為ERROR視窗上有顯示是cvcolor的問題,後來去看define才發現問題不在這裡,所以問題應該是出在於frame或background1上,可是前一個指令frame沒有問題,以就是說問題出在background1。
    後來發現到原來是frame和background1的大小不同,所以才會有問題的,我的視訊經過OpenC開啟後它的影像大小是320x240,可是上面的設定是640x480,大小不同所以發生問題,要解決這個問題很簡單只要把640x480改成320x240就行了,不過這樣改不夠好,應該要讓background1...的大小可以依據視訊的解析度改變比較好,至於要怎樣改,前面有乖乖學的應該就會了(XD)。

    回覆刪除