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 ...
随机推荐
- python打造线程池
# coding=utf-8 import threading import Queue import time import traceback class ThreadPoolExecutor(o ...
- JavaScript之 for...in
for-in 可以用来枚举对象的属性,还有数组的索引,用法: 枚举对象属性 var o={name:'a',age:25,sex:'male'} for(var each in o){ console ...
- PostgreSQL分布式架构之——PL/Proxy
1. PL/Proxy的介绍 1.1 PL/Proxy概述 PL/Proxy是一款能在PostgreSQL数据库实现数据库水平拆分的软件:可以理解分布式架构(shared nothing);但是不是真 ...
- System.exit(0)会跳过finally块的执行
public class test { public static void main(String[] args) { try { System.exit(0); System.out.printl ...
- ConcurrentModificationException 详解
工作中碰到个ConcurrentModificationException.代码如下: List list = ...;for(Iterator iter = list.iterator(); ite ...
- osgearth cache
<map name="readymap.org" type="geocentric"> <options> <!--Specify ...
- 在eclipse里配置Android ndk环境 适用于windows mac 和linux(转)
在eclipse里配置Android ndk环境 适用于windows mac 和linux(转) 2012-02-27 13:02:16| 分类: android | 标签:java prog ...
- Illegal mix of collations for operation 'concat'
在t_employee表中,练习使用concat函数连接字符串时, mysql> select concat('工号为:',fnumber,'的员工的幸福指数:',fsalary/(fage-2 ...
- Oracle和Mysql中mybatis模糊匹配查询区别
1.Oracle AND NAME LIKE '%'||#{name}||'%' 2.Mysql AND NAME LIKE "%"#{name}"%"
- RabbitMQ笔记四:Binding,Queue,Message概念
Binding详解 黄线部分就是binding Exchange与Exchange,Queue之间的虚拟连接,Binding中可以包含Routing key或者参数 创建binding 注意: ...