zoukankan      html  css  js  c++  java
  • 《学习OpenCV》课后习题解答8

    题目:(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函数在图像上添加文字,代码略了。。。

  • 相关阅读:
    【题解】Luogu p2016 战略游戏 (最小点覆盖)
    【模板】Linux下输出文件的对比
    【题解】Luogu P3052 【USACO12】摩天大楼里的奶牛Cows in a Skyscraper
    【题解】滑雪 luogu1434 记忆化搜索
    【题解】Luogu P3110 [USACO14DEC]驮运Piggy Back
    【题解】Luogu P3123 [USACO15OPEN]贝茜说哞Bessie Goes Moo
    【题解】Luogu P2214 [USACO14MAR]哞哞哞Mooo Moo
    【题解】Luogu P2327 [SCOI2005]扫雷
    【题解】Luogu P1011 车站
    【题解】Luogu P2889 [USACO07NOV]挤奶的时间Milking Time
  • 原文地址:https://www.cnblogs.com/huahai/p/7271058.html
Copyright © 2011-2022 走看看