《学习OpenCV》课后习题解答8
2016-05-22 10:34
369 查看
题目:(P126)
本章完整讲述了基本的输入/输出编程以及OpenCV的数据结构。下面的练习是基于前面的知识做一些应用,为后面大程序的实现提供帮助。
a.创建一个程序实现以下功能:(1)从视频文件中读入数据;(2)讲读入数据转换为灰度图;(3)对图像做Canny边缘检测。将三个过程的处理结果显示到不同的窗口中,每个窗口根据其内容合理命名。
b. 将所有三个步骤实现显示在一个图像中。提示:创建一个新的图像,其高度与原始图像相同,宽度为原来视频帧的3倍,将3幅图像分别复制到新的图像中:可使用指针;或者更巧妙地创建三个图像头,三个图像头分别指向图像数据的开始处,1/3处和2/3处,然后使用函数cvCopy()复制。
c.在图像的三个不同部分写上合适的文字标签。
解答a:
解答b:
解答c:就是利用cvPutText函数在图像上添加文字,代码略了。。。
本章完整讲述了基本的输入/输出编程以及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函数在图像上添加文字,代码略了。。。
相关文章推荐
- Eclipse中Tomcat 修改后台代码即时生效
- 《学习OpenCV》课后习题解答8
- 大型电商架构设计各路诸侯点评
- Ubuntu 12.04版本下安装交叉编译器arm-linux-gcc4.3.2
- centos6.5初步安装tomcat8步骤
- [Nutch]Hadoop单机伪分布模式的配置
- actionbar的下拉Menu(dropDownListView)的分割线divider颜色修改
- OpenStack通用技术——消息总线
- Linux java安装 eclipse安装
- shiro架构
- shiro架构
- 在selinux 环境下使用samba
- 从eclipse配置tomcat多实例了解tomcat的多实例
- Linux_信号与信号量
- 网站第三方登录--微信登录(填坑)
- 用户和组与进程凭证
- 《学习OpenCV》课后习题解答7
- CentOS-6.5-x86_64 安装 apache-tomcat-7.0.68.tar.gz
- Programming Scala第5章demo02 Option类型
- 使用 arch-ppa 创建你自己的 Arch Linux 软件库