《学习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: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函数在图像上添加文字,代码略了。。。
0 0
- 《学习OpenCV》课后习题解答8
- 《学习OpenCV》课后习题解答1
- 《学习OpenCV》课后习题解答2
- 《学习OpenCV》课后习题解答3
- 《学习OpenCV》课后习题解答4
- 《学习OpenCV》课后习题解答5
- 《学习OpenCV》课后习题解答6
- 《学习OpenCV》课后习题解答7
- 《学习OpenCV》课后习题解答9
- 《学习OpenCV》课后习题解答(第三章)(仅供参考)
- 《学习OpenCV》课后习题解答(第四章)(仅供参考)(不断更新)
- 学习Opencv 第四章课后习题解答(Exercise 1a)
- 学习Opencv第3章课后习题
- 学习Opencv第2章课后习题
- 学习Opencv第4章课后习题
- 《学习opencv》第四章课后习题1
- 《学习opencv》第四章课后习题2
- 《学习opencv》第五章课后习题1
- Programming Scala 第6章 demo07
- 动态规划10之1015
- R语言之实现Excel的数据透视功能
- 在一个工程中引用另一个工程
- 部分安卓笔记
- 《学习OpenCV》课后习题解答8
- NEFU 1160 线段树
- 课堂作业10
- 关于sqlite的一些总结
- Mongodb中数据聚合之聚合管道aggregate
- Programming Scala 第6章 demo08 偏应用函数
- 浅谈OSI七层网络体系结构
- [推荐算法]ItemCF,基于物品的协同过滤算法
- spark PIPELINE使用