OpenCV第四章练习p126_1
#include <opencv/cv.h> #include <opencv/highgui.h> /* 显示灰度视频 int main(int argc, char *argv[]) { char src[] = "F:\\test\\p126_1\\p126_1\\tree.avi"; CvCapture * capture = 0; IplImage * frame, *gray; capture = cvCreateFileCapture(src); if(capture == NULL) { cvNamedWindow("error",CV_WINDOW_AUTOSIZE); cvWaitKey(0); return 0; } while(1) { frame = cvQueryFrame(capture); if(frame == 0) break; gray = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U, 1); cvConvertImage(frame, gray, 1); cvNamedWindow("p126_1",CV_WINDOW_AUTOSIZE); cvShowImage("p126_1", gray); cvWaitKey(33); } cvReleaseImage(&frame); cvReleaseImage(&gray); cvReleaseCapture(&capture); cvDestroyWindow("p126_1"); } */
// 在一张图片上显示出来 int main(int argc, char *argv[]) { char src[] = "F:\\test\\p126_1\\p126_1\\tree.avi"; CvCapture *capture = 0; IplImage *frame, *gray, *merge; IplImage *head1, *head2, *head3; // char *ptr_img_data; // int i, j, k; capture = cvCreateFileCapture(src); if(capture == NULL) { cvNamedWindow("error",CV_WINDOW_AUTOSIZE); cvWaitKey(0); return 0; } frame = cvQueryFrame(capture); merge = cvCreateImage(cvSize(3*frame->width, frame->height), IPL_DEPTH_8U, 3); head1 = cvCreateImage(cvSize(frame->width, frame->height), IPL_DEPTH_8U, 3); head2 = cvCreateImage(cvSize(frame->width, frame->height), IPL_DEPTH_8U, 3); head3 = cvCreateImage(cvSize(frame->width, frame->height), IPL_DEPTH_8U, 3); head1->widthStep = merge->widthStep; head1->imageData = merge->imageData; head2->widthStep = merge->widthStep; head2->imageData = merge->imageData + frame->width*frame->nChannels; head3->widthStep = merge->widthStep; head3->imageData = merge->imageData + frame->width*frame->nChannels*2; gray = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U, 1); cvConvertImage(frame, gray, 1); /* 像素颜色取反 ptr_img_data = frame->imageData; for(i=0; i<frame->height; i++) for(j=0; j<frame->width; j++) for(k=0; k<frame->nChannels; k++) ptr_img_data[i*frame->widthStep+j*frame->nChannels+k] = 255 - ptr_img_data[i*frame->widthStep+j*frame->nChannels+k]; */ cvConvertImage(frame, head1, 0);// 注释1 cvConvertImage(gray, head2, 1); cvCanny(gray, gray, 0, 255, 3); cvConvertImage(gray, head3, 1); cvNamedWindow("p126_1",CV_WINDOW_AUTOSIZE); cvShowImage("p126_1", merge); cvWaitKey(0); // cvReleaseImage(&frame); // 不能释放cvQueryFrame返回的图像指针 cvReleaseImageHeader(&head1); cvReleaseImageHeader(&head2); cvReleaseImageHeader(&head3); cvReleaseImage(&gray); cvReleaseImage(&merge); cvReleaseCapture(&capture); cvDestroyWindow("p126_1"); }
运行结果:
在上面代码中,因为要判断视频文件是否已经打开了,而messagebox我不会调用,所以当错误是我打开一个窗口,标题为error:
上面代码中cvConvertImage(frame, head1, 0);一开始我传递的第三个参数是3,显示如下:
第一个图像翻转了,且颜色不对,后来发现,cvConvertImage函数的第三个参数flags是转换的模式,可以取0:没有变化;1:垂直翻转,即沿x轴翻转;2:交换红蓝信道;取3时相当1&2,所以即翻转又交换红蓝信道。