第四章课后练习1

1.本章完整讲述了基本的输入/输出编程以及OpenCV的数据结构。下面的练习是基于前面的知识做一些应用,为后面大程序的实现提供帮助。
a.创建一个程序实现以下功能:(1)从视频文件中读入数据;(2)将读入数据转换为灰度图;(3)对图像做Canny边缘检测。将三个过程的处理结果显示到不同的窗口中,每个窗口根据其内容合理命名。
b.将所有三个步骤实现显示在一个图像中。
c.在图像的三个不同部分写上合适的文字标签。

a的程序实现如下

 /*ch4_lx4_1_a.cpp
本程序是learning opencv这本书的课后习题练习
欢迎提出问题一起讨论*/
#include "highgui.h"
#include "cv.h"
IplImage* doCanny(
IplImage* img,
double lowThresh,
double highThresh,
double aperture
){ IplImage* out = cvCreateImage(
cvGetSize(img),
img->depth,
); cvCanny( img,out,lowThresh,highThresh,aperture);//void cvCanny( const CvArr* image,CvArr* edges,double threshold1,double threshold2, int
return(out); //aperture_size=3 );
};
int main( int argc,char** argv){
cvNamedWindow( "frame",CV_WINDOW_AUTOSIZE);
cvNamedWindow( "huidu",CV_WINDOW_AUTOSIZE);
cvNamedWindow( "bianyuan",CV_WINDOW_AUTOSIZE);
CvCapture* capture = cvCreateFileCapture(argv[]);
IplImage* frame;
while(){
frame = cvQueryFrame( capture);
IplImage* huidu = cvCreateImage( cvSize( frame->width,frame->height ), frame->depth, );
cvCvtColor(frame, huidu , CV_BGR2GRAY );
IplImage* bianyuan = doCanny(huidu,,,);
if( !frame ) break;
cvShowImage("frame",frame);
cvShowImage("huidu",huidu);
cvShowImage("bianyuan",bianyuan);
char c = cvWaitKey(); //使视频以30帧每秒的速度播放
if( c==) break;
}
cvReleaseCapture( &capture);
cvDestroyWindow( "frame");
cvDestroyWindow( "huidu");
cvDestroyWindow( "bianyuan");
return ;
}

b.的程序实现涉及到把三个图像合成到一个图像中显示,具体方法参考一篇博文:https://www.cnblogs.com/CBDoctor/archive/2011/09/19/2180998.html

但这个作者的方法中存在一个问题:第一幅图是显示原图,可是原图变成了灰色,原图的宽度被扩大3倍,只能显示出三分之一,相当于被横向拉伸了3倍。但设置的感兴趣区域是原图的大小,作者并没有给出解答。还需进一步改进。

 /*ch4_lx4_1_b.cpp
本程序是learning opencv这本书的课后习题练习
欢迎提出问题一起讨论*/
#include "highgui.h"
#include "cv.h"
IplImage* doCanny(
IplImage* img,
double lowThresh,
double highThresh,
double aperture
){ IplImage* out = cvCreateImage(
cvGetSize(img),
img->depth,
); cvCanny( img,out,lowThresh,highThresh,aperture);//void cvCanny( const CvArr* image,CvArr* edges,double threshold1,double threshold2, int
return(out); //aperture_size=3 );
};
int main( int argc,char** argv){
cvNamedWindow( "frame",CV_WINDOW_AUTOSIZE);
cvNamedWindow( "huidu",CV_WINDOW_AUTOSIZE);
cvNamedWindow( "bianyuan",CV_WINDOW_AUTOSIZE);
cvNamedWindow( "chuangkou",CV_WINDOW_AUTOSIZE);
CvCapture* capture = cvCreateFileCapture(argv[]);
IplImage* frame;
while(){
frame = cvQueryFrame( capture);
IplImage* chuangkou = cvCreateImage(cvSize( frame->width*3.0,frame->height),frame->depth,frame->nChannels);
cvZero(chuangkou);
IplImage* huidu = cvCreateImage( cvSize( frame->width,frame->height ), frame->depth, );
cvCvtColor(frame, huidu , CV_BGR2GRAY );
IplImage* bianyuan = doCanny(huidu,,,);
if( !frame ) break;
//----------------------------------
//载入原图像到目标图像
cvSetImageROI(chuangkou, cvRect(, , frame->width, frame->height));
cvCopy(frame, chuangkou);
cvResetImageROI(chuangkou);
//载入灰度图像到目标图像
cvSetImageROI(chuangkou, cvRect(frame->width, , frame->width, frame->height));
chuangkou->nChannels =;
cvCopy(huidu, chuangkou);
cvResetImageROI(chuangkou);
//载入边缘检测图像到目标图像
cvSetImageROI(chuangkou, cvRect((frame->width) *2.0, , frame->width, frame->height));
chuangkou->nChannels =;
cvCopy(bianyuan, chuangkou);
cvResetImageROI(chuangkou);
//---------------------------------------
cvShowImage("chuangkou",chuangkou);
cvShowImage("frame",frame);
cvShowImage("huidu",huidu);
cvShowImage("bianyuan",bianyuan);
char c = cvWaitKey(); //使视频以30帧每秒的速度播放
if( c==) break;
}
cvReleaseCapture( &capture);
cvDestroyWindow( "frame");
cvDestroyWindow( "huidu");
cvDestroyWindow( "bianyuan");
return ;
}

c.在图像的三个不同部分写上合适的文字标签。主要是调用cvPutText()函数。

 /*ch4_lx4_1_c.cpp
添加功能:为三个图像添加文字
本程序是learning opencv这本书的课后习题练习
欢迎提出问题一起讨论*/
#include "highgui.h"
#include "cv.h"
IplImage* doCanny(
IplImage* img,
double lowThresh,
double highThresh,
double aperture
){ IplImage* out = cvCreateImage(
cvGetSize(img),
img->depth,
); cvCanny( img,out,lowThresh,highThresh,aperture);//void cvCanny( const CvArr* image,CvArr* edges,double threshold1,double threshold2, int
return(out); //aperture_size=3 );
};
int main( int argc,char** argv){
cvNamedWindow( "frame",CV_WINDOW_AUTOSIZE);
cvNamedWindow( "huidu",CV_WINDOW_AUTOSIZE);
cvNamedWindow( "bianyuan",CV_WINDOW_AUTOSIZE);
cvNamedWindow( "chuangkou",CV_WINDOW_AUTOSIZE);
CvCapture* capture = cvCreateFileCapture(argv[]);
IplImage* frame;
while(){
frame = cvQueryFrame( capture);
IplImage* chuangkou = cvCreateImage(cvSize( frame->width*3.0,frame->height),frame->depth,frame->nChannels);
cvZero(chuangkou);
IplImage* huidu = cvCreateImage( cvSize( frame->width,frame->height ), frame->depth, );
cvCvtColor(frame, huidu , CV_BGR2GRAY );
IplImage* bianyuan = doCanny(huidu,,,);
//为三幅图像添加文字
CvFont* font;
cvInitFont(font,CV_FONT_HERSHEY_SIMPLEX,1.0,1.0,0.0,,);
cvPutText(frame,"liuyutong",cvPoint(,),font,cvScalar(,,));
cvPutText(huidu,"liuyutong",cvPoint(,),font,cvScalar(,,));
cvPutText(bianyuan,"liuyutong",cvPoint(,),font,cvScalar(,,));
if( !frame ) break;
//----------------------------------
//载入原图像到目标图像
cvSetImageROI(chuangkou, cvRect(, , frame->width, frame->height));
cvCopy(frame, chuangkou);
cvResetImageROI(chuangkou);
//载入灰度图像到目标图像
cvSetImageROI(chuangkou, cvRect(frame->width, , frame->width, frame->height));
chuangkou->nChannels =;
cvCopy(huidu, chuangkou);
cvResetImageROI(chuangkou);
//载入边缘检测图像到目标图像
cvSetImageROI(chuangkou, cvRect((frame->width) *2.0, , frame->width, frame->height));
chuangkou->nChannels =;
cvCopy(bianyuan, chuangkou);
cvResetImageROI(chuangkou);
//---------------------------------------
cvShowImage("chuangkou",chuangkou);
cvShowImage("frame",frame);
cvShowImage("huidu",huidu);
cvShowImage("bianyuan",bianyuan);
char c = cvWaitKey(); //使视频以30帧每秒的速度播放
if( c==) break;
}
cvReleaseCapture( &capture);
cvDestroyWindow( "frame");
cvDestroyWindow( "huidu");
cvDestroyWindow( "bianyuan");
return ;
}

OpenCV学习笔记之课后习题练习4-1的更多相关文章

  1. OpenCV学习笔记之课后习题练习3-5

    OpenCV学习笔记之课后习题练习2-5 练习使用感兴趣区域(ROI).创建一个210*210的单通道图像并将其归0.在图像中使用ROI和cvSet()建立一个增长如金字塔状的数组. 参考博文:www ...

  2. OpenCV学习笔记之课后习题练习2-5

    5.对练习4中的代码进行修改,参考例2-3,给程序加入滚动条,使得用户可以动态调节缩放比例,缩放比例的取值为2-8之间.可以跳过写入磁盘操作,但是必须将变换结果显示在窗口中. 参考博文:blog.cs ...

  3. OpenCV学习笔记之课后习题练习2-3

    3.使用例2-10中的视频捕捉和存储方法,结合例2-5中的doPyrDown()创建一个程序,使其从摄像机读入视频数据并将缩放变换后的彩色图像存入磁盘. 例2-10中所用的方法虽然能正常运行,但却不能 ...

  4. OpenCV学习笔记之课后习题练习3-4

    练习:创建一个大小为100*100的三通道RGB图像.将它的元素全部置0.使用指针算法以(20,5)与(40,20)为顶点绘制一个绿色平面. 参考博文:blog.csdn.net/qq_2077736 ...

  5. OpenCV学习笔记之课后习题练习3-3

    3.3 创建一个100*100的拥有三个通道的二维字节类型矩阵,将其元素全部置0.通过cvPtr2D函数将指针指向中间通道(绿色),以(20,5)和(40,20)为顶点间画一个绿色的长方形. cvPt ...

  6. opencv学习笔记(七)SVM+HOG

    opencv学习笔记(七)SVM+HOG 一.简介 方向梯度直方图(Histogram of Oriented Gradient,HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子 ...

  7. opencv学习笔记(六)直方图比较图片相似度

    opencv学习笔记(六)直方图比较图片相似度 opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将 ...

  8. opencv学习笔记(五)镜像对称

    opencv学习笔记(五)镜像对称 设图像的宽度为width,长度为height.(x,y)为变换后的坐标,(x0,y0)为原图像的坐标. 水平镜像变换: 代码实现: #include <ios ...

  9. opencv学习笔记(四)投影

    opencv学习笔记(四)投影 任选了一张图片用于测试,图片如下所示: #include <cv.h> #include <highgui.h> using namespace ...

随机推荐

  1. Spring Cloud Sleuth 使用教程

    Spring Cloud Sleuth 使用案例 Span术语(Terminology) Span:基本工作单元,例如,在一个新建的span中发送一个RPC等同于发送一个回应请求给RPC,span通过 ...

  2. SpEL、PropertyPlaceholderConfigurer与@Value、#{}、${}

    概念 SpEL:Spring EL表达式 PropertyPlaceholderConfigurer:即org.springframework.beans.factory.config.Propert ...

  3. 8 -- 深入使用Spring -- 2...6 Spring 4.0 增强的自动装配和精确装配

    8.2.6 Spring 4.0 增强的自动装配和精确装配 Spring提供了@Autowired 注解来指定自动装配,@Autowired可以修饰setter方法.普通方法.实例变量和构造器等.当使 ...

  4. Redis存读取数据

    这一节演示下载.NET中怎样使用Redis存储数据.在.net中比较常用的客户端类库是ServiceStack,看下通过servicestack怎样存储数据. DLL下载:https://github ...

  5. Django SimpleCMDB 使用序列化

    如下,前面我们是使用 urllib 方法来转换并传递数据的: [root@localhost ~]$ tail /data/script/getHostInfo.py if __name__ == ' ...

  6. 在javaweb的项目当中实现随机数字的生成

    首先,需要在javaweb的项目当中新建一个Servlet文件,然后再web.xml中配置一下: 这样运行的时候就可以通过“http://localhost:8080/Response/Respons ...

  7. c++学习笔记——个单词转换的map程序详解

    实现功能:给定一个string,将它转换为另一个string.程序输入是两个文件,第一个文件保存转换规则,第二个文件为将要进行转换的文本. IDE:Windows7+VS2013 #include & ...

  8. Form表单验证神器: BootstrapValidator

    前言:做Web开发的我们,表单验证是再常见不过的需求了.友好的错误提示能增加用户体验.博主搜索bootstrap表单验证,搜到的结果大部分都是文中的主题:bootstrapvalidator.今天就来 ...

  9. 解析pdb文件得到未导出变量地址(转)

    程序要用到dbghelp.dll中的一些函数 http://msdn.microsoft.com/en-us/library/ms679291%28VS.85%29.aspx 要自己下载系统对应的符号 ...

  10. WP8.1学习系列(第十一章)——中心控件Hub开发指南

    在本文中 先决条件 什么是中心控件? 添加中心控件 将分区添加到中心 添加交互式分区头用于导航 将展示磁贴添加到中心 使用窄应用中的垂直中心 借助中心使用语义式缩放视图 摘要和后续步骤 重要的 API ...