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

《学习OpenCV》课后习题解答8的更多相关文章

  1. 機器學習基石(Machine Learning Foundations) 机器学习基石 作业三 课后习题解答

    今天和大家分享coursera-NTU-機器學習基石(Machine Learning Foundations)-作业三的习题解答.笔者在做这些题目时遇到非常多困难,当我在网上寻找答案时却找不到,而林 ...

  2. 《学习OpenCV》课后习题解答6

    题目:(P104) 使用cvCmp()创建一个掩码.加载一个真实的图像.使用cvsplit()将图像分割成红,绿,蓝三个单通道图像. a.找到并显示绿图. b.克隆这个绿图两次(分别命名为clone1 ...

  3. 《学习OpenCV》课后习题解答5

    题目:(P104) 为一个图像创建多个图像头.读取一个大小至少为100*100的图像.另创建两个图像头并设置它们的origion,depth,nChannels和widthStep属性同之前读取的图像 ...

  4. 《学习OpenCV》课后习题解答4

    题目:(P104) 练习使用感兴趣区域(ROI).创建一个210*210的单通道图像并将其归0.在图像中使用ROI和cvSet()建立一个增长如金字塔状的数组.也就是:外部边界为0,下一个内部边界应该 ...

  5. 《学习OpenCV》课后习题解答3

    题目:(P104) 创建一个大小为100*100的三通道RGB图像.将它的元素全部置0.使用指针算法以(20,5)与(40,20)为项点绘制一个绿色平面. 解答: #include "cv. ...

  6. 《学习OpenCV》课后习题解答2

    题目:(P104) 创建一个拥有三个通道的二维字节类型矩阵,大小为100*100,并将所有值赋为0.通过函数cvPtr2D将指针指向中间的通道("绿色").以(20,5)与(40, ...

  7. 《学习OpenCV》课后习题解答9

    题目:(P126) 创建一个程序,使其读入并显示一幅图像.当用户鼠标点击图像时,获取图像对应像素的颜色值(BGR),并在图像上点击鼠标处用文本将颜色值显示出来. 解答: 本题关键是会用cvGet2D获 ...

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

    题目:(P105) 创建一个结构,结构中包含一个整数,一个CvPoint和一个 CvRect:称结构体为"my_struct". a. 写两个函数:void Write_my_st ...

  9. 《学习OpenCV》课后习题解答1

    题目:(P104) 下面这个练习是帮助掌握矩阵类型.创造一个三通道二维矩阵,字节类型,大小为100*100,并设置所有数值为0. a.在矩阵中使用cvCircle( CvArr* img, CvPoi ...

随机推荐

  1. 只包含因子2 3 5的数(51NOD 1010)

    K的因子中只包含2 3 5.满足条件的前10个数是:2,3,4,5,6,8,9,10,12,15. 所有这样的K组成了一个序列S,现在给出一个数n,求S中 >= 给定数的最小的数. 例如:n = ...

  2. 如何安全地跨窗体调用Timer控件 从一个窗体调用控制另外一个窗体的控件

    具体的情况是Form1中有一个Timer2时钟,Timer2时钟事件弹出Warning窗体,点击Warning窗体上面的按钮,重新激活一下Form1中的Timer2.从而实现了从一个窗体调用另外一个窗 ...

  3. Eclipse中各种文件的注释与取消注释的快捷键

    Eclipse中各种文件的注释与取消注释的快捷键 Java文件: 注释和取消注释的快捷键都是:CTRL + / 或 Shift+Ctrl+C JS文件: 注释和取消注释的快捷键都是:CTRL + / ...

  4. simpleXML技术解析xml文件(php)

    1.simpleXML的核心思想:以面向对象的方法来操作xml文件 此技术可以将xml文件的所有元素都转成对象.会返回一个对象数组,再用foreach遍历,即可得到元素的名称,内容,和属性值. tes ...

  5. Docker(一):概述

    Docker 是什么? Docker是一个开源的应用容器引擎,基于Go语言开发 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后 ...

  6. ECSHOP和SHOPEX快递单号查询德邦插件V8.6专版

    发布ECSHOP说明: ECSHOP快递物流单号查询插件特色 本ECSHOP快递物流单号跟踪插件提供国内外近2000家快递物流订单单号查询服务例如申通快递.顺丰快递.圆通快递.EMS快递.汇通快递.宅 ...

  7. 微信小程序中无刷新修改

    1.点击事件无刷新修改 原理:onload事件中是把这个分类和品牌的列表全部拿出来,拼接成数组的格式,在小程序中遍历的时候就要把小标(index)给绑定到左侧的品牌上,然后js中获取index的值,就 ...

  8. 基于OMAPL:Linux3.3内核的编译

    基于OMAPL:Linux3.3内核的编译 OMAPL对应3个版本的linux源代码,分别是:Linux-3.3.Linux-2.6.37.Linux2.6.33,这里的差距在于Linux2,缺少SY ...

  9. windows环境下,用python绘图库matplotlib绘图时中文乱码问题

    1.下载中文字体(看自己爱好就行)下面这个举例: SimHei - Free Font Download​www.fontpalace.co 2.下载之后,打开即可安装,将字体安装进windows系统 ...

  10. python更新mysql数据

    >>>cur.execute("update users set username=%s where id=2",("mypython")) ...