OpenCV学习笔记之课后习题练习4-1
第四章课后练习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的更多相关文章
- OpenCV学习笔记之课后习题练习3-5
OpenCV学习笔记之课后习题练习2-5 练习使用感兴趣区域(ROI).创建一个210*210的单通道图像并将其归0.在图像中使用ROI和cvSet()建立一个增长如金字塔状的数组. 参考博文:www ...
- OpenCV学习笔记之课后习题练习2-5
5.对练习4中的代码进行修改,参考例2-3,给程序加入滚动条,使得用户可以动态调节缩放比例,缩放比例的取值为2-8之间.可以跳过写入磁盘操作,但是必须将变换结果显示在窗口中. 参考博文:blog.cs ...
- OpenCV学习笔记之课后习题练习2-3
3.使用例2-10中的视频捕捉和存储方法,结合例2-5中的doPyrDown()创建一个程序,使其从摄像机读入视频数据并将缩放变换后的彩色图像存入磁盘. 例2-10中所用的方法虽然能正常运行,但却不能 ...
- OpenCV学习笔记之课后习题练习3-4
练习:创建一个大小为100*100的三通道RGB图像.将它的元素全部置0.使用指针算法以(20,5)与(40,20)为顶点绘制一个绿色平面. 参考博文:blog.csdn.net/qq_2077736 ...
- OpenCV学习笔记之课后习题练习3-3
3.3 创建一个100*100的拥有三个通道的二维字节类型矩阵,将其元素全部置0.通过cvPtr2D函数将指针指向中间通道(绿色),以(20,5)和(40,20)为顶点间画一个绿色的长方形. cvPt ...
- opencv学习笔记(七)SVM+HOG
opencv学习笔记(七)SVM+HOG 一.简介 方向梯度直方图(Histogram of Oriented Gradient,HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子 ...
- opencv学习笔记(六)直方图比较图片相似度
opencv学习笔记(六)直方图比较图片相似度 opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将 ...
- opencv学习笔记(五)镜像对称
opencv学习笔记(五)镜像对称 设图像的宽度为width,长度为height.(x,y)为变换后的坐标,(x0,y0)为原图像的坐标. 水平镜像变换: 代码实现: #include <ios ...
- opencv学习笔记(四)投影
opencv学习笔记(四)投影 任选了一张图片用于测试,图片如下所示: #include <cv.h> #include <highgui.h> using namespace ...
随机推荐
- 一些JavaScript基本函数
1.document.write(”");为 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document->html->(head,body) 4.一个浏览 ...
- Java使用String类格式化当前日期
在输出日期信息时,经常需要输出不同格式的日期格式,本实例中介绍了String字符串类中的日期格式化方法,实例使用不同的方式输出String类的日期格式参数值,组合这些值可以实现特殊格式的日期字符串. ...
- 第四章 TCP粘包/拆包问题的解决之道---4.2--- 未考虑TCP粘包导致功能异常案例
4.2 未考虑TCP粘包导致功能异常案例 如果代码没有考虑粘包/拆包问题,往往会出现解码错位或者错误,导致程序不能正常工作. 4.2.1 TimeServer 的改造 Class : TimeServ ...
- 解决SOCKET通信 ERROR_INSUFFICIENT_BUFFER错误
错误发生在服务端异步收到一个socket连接,之后使用WSAGetLastError()得到的IO错误码是122 这个错误码在系统中的解释是The data area passed to a syst ...
- XSS三重URL编码绕过实例
遇到一个很奇葩的XSS,我们先来加一个双引号,看看输出: 双引号被转义了,我们对双引号进行URL双重编码,再看一下输出: 依然被转义了,我们再加一层URL编码,即三重url编码,再看一下输出: URL ...
- U3D的控制
做游戏少不了控制,但是一个成熟的游戏引擎,是不能简单仅仅获取键盘中或者遥感确定的按键来控制,要考虑到用户更改游戏按键的情况,当然也得考虑到不同设备的不通输入方式,比如U3D是可以运行在iphone上的 ...
- [Vim] 搜索模式(正则表达式)
本文介绍如何使用Vim的搜索模式. 搜索单词 Vim中使用 \< 和 \> 分别表示单词的开头和结尾,例如查找单词 i 而不是字母 i ,在正常模式下,按下 / 启动搜索模式,输入 \&l ...
- 无刷新上传图片以及使用C#语言
写这个纯属是给自己一个记忆啦 一.前台的代码以及调用的js <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtm ...
- 使用jsp实现文件上传的功能
首先是表单的jsp文件:upload.jsp <%@ page contentType="text/html;charset=UTF-8" language="ja ...
- App store最新审核标准公布
本文转载至 http://blog.csdn.net/shuidonglCH/article/details/47083623 导读:苹果近日更新了App Store审核指南的相关章节,对此前版本进行 ...