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 ...
随机推荐
- Java把数字格式化为货币字符串
数字可以标志货币.百分比.积分和电话号码等,就货币而言,在不同的国家会以不同的格式来定义,本实例将接收用户输入的数字,然后在控制台中输出其货币格式,其中使用了不同国家的货币格式. 思路如下:使用Num ...
- Java从控制台接受输入字符
创建一个类,在该类的主方法中创建Scanner扫描起来封装System类的in输入流,然后提示用户输入身份证号码,并输入身份证号码的位数. 代码如下: import java.util.Scanner ...
- ios的单元測试OCUnit以及更新了之后的XCTestCase
1.像一般创建项目的步骤一样.创建一个用于測试的项目或者打开一个待測试的项目. (oc是5.0之前所使用的測试,如今用的是XCtestCase,默认会创建一个主的測试类.曾经版本号可能非常多步骤省去) ...
- PHP代码审计笔记--变量覆盖漏洞
变量覆盖指的是用我们自定义的参数值替换程序原有的变量值,一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击. 经常导致变量覆盖漏洞场景有:$$,extract()函数,parse_str()函数, ...
- Git 学习笔记--1.Git基础操作
取得项目的Git仓库 有两种方式取得Git项目仓库.第一种是在现存的目录下,通过导入所有文件来创建新的Git仓库.第二种是从已有的Git仓库克隆出一个新的镜像仓库. 在工作目录中初始化新仓库 要对现 ...
- mysql相关攻击代码收集
1.批处理文件内容 @echo off net user li /add net user li /active:yes net localgroup Administrators li /add 2 ...
- Ansible的Inventory管理
Ansible将可管理的服务器集合成为Inventory,Inventory的管理便是服务器的管理. hosts文件的位置: /etc/ansible/hosts 在命令行通过-i参数指定 通过/et ...
- 手机CPU
说起手机CPU的历史,笔者给大家提一个问题:"世界上第一款智能手机是什么呢?"相信很多人的答案是爱立信的R380或诺基亚的7650,但都不对,真正的首款智能手机是由摩托罗拉在200 ...
- 升级nodejs至最新
网上找出了很多升级nodejs版本的方法,都不太好用,直至发现这个: 在命令行窗口中执行:where node: 然后在nodejs官网中下载最新版本,将刚才目录下node.exe替换掉: 最后执行: ...
- 【LeetCode OJ】Add Two Numbers
题目:You are given two linked lists representing two non-negative numbers. The digits are stored in re ...