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,所以即翻转又交换红蓝信道。

posted on 2013-03-21 23:35  suwen  阅读(283)  评论(0编辑  收藏  举报

导航