《学习OpenCV》课后习题解答8

来源:互联网 发布:java nextline用法 编辑:程序博客网 时间:2024/06/07 02:23

题目:(P126)
本章完整讲述了基本的输入/输出编程以及OpenCV的数据结构。下面的练习是基于前面的知识做一些应用,为后面大程序的实现提供帮助。
a.创建一个程序实现以下功能:(1)从视频文件中读入数据;(2)讲读入数据转换为灰度图;(3)对图像做Canny边缘检测。将三个过程的处理结果显示到不同的窗口中,每个窗口根据其内容合理命名。
b. 将所有三个步骤实现显示在一个图像中。提示:创建一个新的图像,其高度与原始图像相同,宽度为原来视频帧的3倍,将3幅图像分别复制到新的图像中:可使用指针;或者更巧妙地创建三个图像头,三个图像头分别指向图像数据的开始处,1/3处和2/3处,然后使用函数cvCopy()复制。
c.在图像的三个不同部分写上合适的文字标签。

解答a:

#include<cv.h>#include<highgui.h>int main(int argc, char** argv){    cvNamedWindow("WIN1", CV_WINDOW_AUTOSIZE);    cvNamedWindow("WIN2", CV_WINDOW_AUTOSIZE);    cvNamedWindow("WIN3", CV_WINDOW_AUTOSIZE);    CvCapture* capture = cvCreateFileCapture(argv[1]);    if (!capture) { return -1; }    IplImage* frame;    IplImage* frame1;    IplImage* frame2;    IplImage* frame3;    while (1) {        frame = cvQueryFrame(capture);        if (!frame)break;        frame1 = frame;        frame2 = cvCreateImage(cvGetSize(frame), frame->depth, 1);        frame3 = cvCreateImage(cvGetSize(frame), frame->depth, 1);        cvCvtColor(frame, frame2, CV_BGR2GRAY);//转换成灰度图        cvCanny(frame2,frame3,10,100);//进行Canny边缘检测。        cvShowImage("WIN1", frame1);        cvShowImage("WIN2", frame2);        cvShowImage("WIN3", frame3);        char c = cvWaitKey(33);        if (c == 27)break;    }    cvReleaseCapture(&capture);    cvDestroyWindow("WIN1");    cvDestroyWindow("WIN2");    cvDestroyWindow("WIN3");}

解答b:

#include "cv.h"#include "highgui.h"int main(int argc, char** argv){    //根据要求首先定义4个不同的窗口,用于处理后图像的显示    cvNamedWindow("sourceImg");    cvNamedWindow("grayImg");    cvNamedWindow("cannyImg");    cvNamedWindow("newImg");    CvCapture *capture = cvCreateFileCapture(argv[1]);    if (!capture)return -1;    IplImage *sourceImg = cvQueryFrame(capture);    int  width = sourceImg->width;    int  heigth = sourceImg->height;    IplImage *grayImg = cvCreateImage(cvGetSize(sourceImg), sourceImg->depth, 1);    IplImage *cannyImg = cvCreateImage(cvGetSize(sourceImg), sourceImg->depth, 1);    //创建一个新的图像,用来保存上述3个图像(本代码的核心思想所在)    IplImage *newImg = cvCreateImage(cvSize(3 * sourceImg->width, sourceImg->height), sourceImg->depth, sourceImg->nChannels);    cvZero(newImg);    while ((sourceImg = cvQueryFrame(capture)) != NULL)    {        //从彩色图像转换成灰度图像        cvCvtColor(sourceImg, grayImg, CV_BGR2GRAY);        //Canny推荐的上下阈值比为2:13:1之间,这里使用了3:1,可自行修改highThresh:lowThresh的比例        cvCanny(grayImg, cannyImg, 10, 30, 3);        //运行发现,灰度和canny图像翻转了,所以通过重新定义图像原点        //origin为0表示顶左结构,origin为1表示底左结构        grayImg->origin = 1;        cannyImg->origin = 1;        //载入原图像到目标图像        cvSetImageROI(newImg, cvRect(0, 0, sourceImg->width, sourceImg->height));        //由于读入的是视频文件,并且原视频帧和处理后的视频帧通道数可能不同,所以此处需要手动设置通道数        newImg->nChannels = sourceImg->nChannels;        cvCopy(sourceImg, newImg);        cvResetImageROI(newImg);        cvSetImageROI(newImg, cvRect(sourceImg->width, 0, sourceImg->width, sourceImg->height));        newImg->nChannels = 1;        cvCopy(grayImg, newImg);        cvResetImageROI(newImg);        cvSetImageROI(newImg, cvRect(2 * (sourceImg->width), 0, sourceImg->width, sourceImg->height));        newImg->nChannels = 1;        cvCopy(cannyImg, newImg);        cvResetImageROI(newImg);        cvShowImage("sourceImg", sourceImg);        cvShowImage("grayImg", grayImg);        cvShowImage("cannyImg", cannyImg);        cvShowImage("newImg", newImg);        cvWaitKey(33);    }    cvReleaseImage(&grayImg);    cvReleaseImage(&cannyImg);    cvReleaseImage(&newImg);    cvReleaseCapture(&capture);    cvDestroyWindow("sourceImg");    cvDestroyWindow("grayImg");    cvDestroyWindow("cannyImg");    cvDestroyWindow("newImg");    return 0;}

解答c:就是利用cvPutText函数在图像上添加文字,代码略了。。。

0 0
原创粉丝点击