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 ...
随机推荐
- Git------如何使用Git Bash Here提交代码
转载:码云帮助文档地址 http://git.mydoc.io/?t=154712 1.打开“Git Bash Here” 2.输入: ssh-keygen -t rsa -C "xxxxx ...
- SQLServer------远程调用失败
1.情况 出现 2.解决方法 打开“控制面板” -> “卸载程序” -> 找到 “Microsoft SQL Server 2016) ExpressLocalDB”将其卸载 -> ...
- 常用CSS备忘
1 怎样让div中的img居中 水平居中:div设置:text-align:center; img设置:width:图片宽度; margin:0 auto; 垂直居中:div设置:position:r ...
- iOS NSError
写在前面 在iOS开发中,NSError的使用非常常见,使用也比较简单,也正因为简单,所以对这一部分知识不甚注重.但是近期在做app底层网络封装时发现了一些问题.我使用的网络框架是AFNetworki ...
- 一句话木马:ASPX篇
aspx木马收集: <%@ Page Language="Jscript"%><%eval(Request.Item["chopper"],& ...
- Ansible Playbook handlers 语句
handlers 用法如下,表示当 tasks 执行成功之后再执行 handlers,相当于 shell 中的 && 用法,如果 tasks 执行失败是不会执行 handlers 语句 ...
- springboot 集成elasticsearch
In this article, we will discuss about “How to create a Spring Boot + Spring Data + Elasticsearch Ex ...
- linux shell 随机字符生成单词
#!/bin/sh #生成随机5个单词 filecount= wordcount= flag= #-lt -le -gt -ge -eq #while [ $f -lt $filecount ]; # ...
- SQL Server 索引结构及其使用(二)
作者:freedk 一.深入浅出理解索引结构 改善SQL语句 很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解.比如: select ...
- 【Laravel5.5】 Laravel 在views中加载公共页面怎么实现
背景: 在做后台功能时候,我们需要把头部和尾部摘出来作为公共模板使用 1:我们使用了Blade模板,并创建一个header.blade.php作为通用的模板.将子页面作为yield输出: header ...