Opencv的基本操作
opencv基本使用方法

OpenCV基本使用方法一、介绍O p en CV是一个开源的计算机视觉库,提供了丰富的图像处理和计算机视觉算法,可以用于图像处理、目标检测、人脸识别等各种应用。
本文档将介绍O pe nC V的基本使用方法,包括图像读取、显示、保存以及常用的图像处理操作。
二、图像读取与显示1.读取图像要读取图像,可以使用`cv2.im re ad()`函数。
该函数接受图像文件的路径作为参数,并返回一个表示图像的多维数组。
i m po rt cv2i m ag e=cv2.im re ad("im ag e.jp g")2.显示图像要显示图像,可以使用`cv2.im sh ow()`函数。
该函数接受一个窗口名称和一个表示图像的多维数组作为参数。
i m po rt cv2i m ag e=cv2.im re ad("im ag e.jp g")c v2.im sh ow("Im age",i ma ge)c v2.wa it Ke y(0)c v2.de st ro yA ll Wind ow s()三、图像保存与格式转换1.保存图像要保存图像,可以使用`cv2.im wr it e()`函数。
该函数接受图像保存的路径和表示图像的多维数组作为参数。
i m po rt cv2i m ag e=cv2.im re ad("im ag e.jp g")c v2.im wr it e("n ew_i ma ge.j pg",im age)2.格式转换要将图像从一种格式转换为另一种格式,可以使用`c v2.c vt Co lo r()`函数。
该函数接受表示图像的多维数组和转换的标志作为参数。
i m po rt cv2i m ag e=cv2.im re ad("im ag e.jp g")g r ay_i ma ge=c v2.cv t Co lo r(im ag e,cv2.CO LO R_BG R2GR AY)四、常用的图像处理操作1.转换为灰度图要将彩色图像转换为灰度图,可以使用`c v2.cv tC ol or()`函数,并指定转换标志为`cv2.CO LO R_BG R2GR AY`。
open cv常见操作

open cv常见操作OpenCV是一个广泛应用于计算机视觉领域的开源图像处理库,提供了丰富的图像处理和计算机视觉算法。
本文将介绍一些常见的OpenCV操作,包括图像读取、显示、保存、调整大小、灰度化、边缘检测、图像平滑和图像旋转等。
一、图像读取和显示使用OpenCV读取图像非常简单,只需要调用cv2.imread()函数并指定图像的路径即可。
读取后的图像数据可通过cv2.imshow()函数进行显示。
需要注意的是,OpenCV读取的图像数据是以BGR顺序存储的,如果需要显示正确的颜色,需要将其转换为RGB格式。
二、图像保存使用cv2.imwrite()函数可以将图像保存为指定的文件。
该函数的第一个参数是保存的路径及文件名,第二个参数是要保存的图像数据。
三、调整图像大小图像大小调整是图像处理中常见的操作之一,OpenCV提供了cv2.resize()函数实现图像的缩放。
该函数的第一个参数是要调整大小的图像,第二个参数是目标图像的大小,可以指定为具体的像素值或者按比例缩放。
四、图像灰度化灰度化是指将彩色图像转换为灰度图像的过程。
在OpenCV中,可以使用cv2.cvtColor()函数将彩色图像转换为灰度图像。
该函数的第一个参数是要转换的图像,第二个参数是转换的方式,可以指定为cv2.COLOR_BGR2GRAY。
五、边缘检测边缘检测是图像处理中常见的操作之一,可以用于检测物体的边界。
在OpenCV中,可以使用cv2.Canny()函数实现边缘检测。
该函数的第一个参数是要检测边缘的图像,第二个参数是设定的阈值,用于控制边缘的检测结果。
六、图像平滑图像平滑可以用于去除图像中的噪声,使图像变得更加清晰。
在OpenCV中,可以使用cv2.GaussianBlur()函数实现图像的高斯平滑。
该函数的第一个参数是要平滑的图像,第二个参数是高斯核的大小,用于控制平滑的程度。
七、图像旋转图像旋转可以改变图像的角度,常用于图像的矫正和特征提取。
c++的opencv使用方法总结

C++的OpenCV使用方法总结在计算机视觉和图像处理领域,OpenCV是一个非常强大的开源库,它提供了丰富的功能和工具,用于处理图像和视频。
作为C++程序员,了解并熟练使用OpenCV库是非常重要的。
本文将对C++中使用OpenCV的方法进行总结,并探讨一些常见的应用和技巧。
一、安装和配置OpenCV在开始使用OpenCV之前,首先需要安装和配置这个库。
在Windows评台上,可以通过下载预编译的二进制文件进行安装;在Linux评台上,可以通过包管理器进行安装。
安装完毕后,还需进行一些环境配置,确保编译器能够正确信息OpenCV库文件。
二、基本图像处理1. 读取和显示图像在C++中使用OpenCV读取和显示图像非常简单,只需几行代码即可完成。
首先需要使用imread函数读取图像文件,然后使用imshow 函数显示图像。
在进行图像显示后,需要使用waitKey函数等待用户按下某个键,以便关闭显示窗口。
2. 图像的基本操作OpenCV提供了丰富的图像处理函数,包括图像缩放、旋转、平移、通道拆分与合并等。
这些函数可以帮助我们对图像进行各种基本操作,从而满足不同的需求。
三、特征提取与描述1. Harris角点检测Harris角点检测是一种经典的特征点检测方法,它可以用来识别图像中的角点。
在OpenCV中,我们可以使用cornerHarris函数来实现Harris角点检测,然后对检测结果进行筛选和标记。
2. SIFT特征提取SIFT是一种广泛应用的特征提取算法,它具有旋转不变性和尺度不变性。
在OpenCV中,我们可以使用SIFT算法来提取图像的关键点和特征描述子,从而实现图像匹配和目标识别等功能。
四、图像分类与识别1. 使用支持向量机(SVM)进行图像分类OpenCV提供了对机器学习算法的支持,包括SVM分类器。
我们可以使用SVM对图像进行分类,从而实现图像识别和目标检测等功能。
2. 使用深度学习模型进行图像识别近年来,深度学习在图像识别领域取得了显著的成就。
opencv二值化轮廓提取

opencv二值化轮廓提取
在图像处理中,二值化是一种基本的图像分割方法,通常用于提取感
兴趣的目标轮廓。
通过将图像中的像素值限定在两个特定的值范围内,即0和255(或1和0),将图像分为背景和前景两部分。
opencv是一个广泛使用的开源计算机视觉库,提供了许多图像处理功能,包括二值化和轮廓提取。
在opencv中,可以使用以下步骤实现二值化轮廓提取:
1. 读取图像:使用opencv的函数读取图像,并将其转换为灰度图像(单通道图像)。
2. 图像二值化:通过使用opencv的函数,将灰度图像进行二值化处理。
可以选择适当的阈值方法,如自适应阈值或全局阈值等。
3. 轮廓提取:使用opencv的函数,对二值化图像进行轮廓提取操作。
可以选择适当的轮廓提取算法,如findContours()函数。
该函数将返
回图像中所有轮廓的坐标。
4. 绘制轮廓:使用opencv的绘图函数,将得到的轮廓坐标在原始图
像上进行绘制,以便可视化结果。
5. 显示结果:使用opencv的图像显示函数,将绘制了轮廓的图像显
示出来,以便查看或保存结果。
通过以上步骤,可以实现对图像的二值化轮廓提取。
通过调整二值化
的阈值和选择合适的轮廓提取算法,可以获得更好的轮廓提取效果。
这在许多计算机视觉应用中都是一个重要的步骤,如目标检测、物体跟踪等。
OpenCV入门教程

O p e n C V入门教程-CAL-FENGHAI.-(YICAI)-Company One1OpenCV 入门教程作者:于仕琪年 8 月版权所有于仕琪本作品采用知识共享署名-相同方式共享国际许可协议进行许可。
1前言OpenCV 是一个广受欢迎的开源计算机视觉库,它提供了很多函数,实现了很多计算机视觉算法,算法从最基本的滤波到高级的物体检测皆有涵盖。
很多初学者希望快速掌握OpenCV 的使用方法,但往往会遇到各种各样的困难。
其实仔细分析,造成这些困难的原因有两类:第一类是C/C++编程基础不过关;第二类是不了解算法原理。
解决这些困难无非提升编程能力,以及提升理论基础知识。
提升编程能力需要多练习编程,提升理论知识需要系统学习《数字图像处理》、《计算机视觉》和《模式识别》等课程,所有这些都不能一蹴而就,需要耐下心来认真修炼。
同时我们也需要认识到 OpenCV 只是一个算法库,能为我们搭建计算机视觉应用提供“砖头”。
我们并不需要完全精通了算法原理之后才去使用 OpenCV,只要了解了“砖头”的功能,就可以动手了。
在实践中学习才是最高效的学习方式。
本小册子希望为初学者提供引导,使初学者快速了解 OpenCV 的基本数据结构以及用法。
此外,如您发现有错误之处,欢迎来信指正。
于仕琪深圳大学插播广告:欢迎有能力、有激情以及对计算机视觉有兴趣的同学报考我的研究生。
欲了解详情可以访问深圳大学招生网或者给我发 email。
目录第 1 章预备知识 (5)编程的流程 (5)什么叫编辑 (6)什么叫编译 (6)什么叫连接 (7)什么叫运行 (7)Visual C++是什么 (8)头文件 (9)库文件 (10)OpenCV 是什么 (11)什么是命令行参数 (12)常见编译错误 (13)找不到头文件 (13)拼写错误 (14)常见链接错误 (15)运行时错误 (17)第 2 章OpenCV 介绍 (19)OpenCV 的来源 (19)OpenCV 的协议 (19)第 3 章图像的基本操作 (21)图像的表示 (21)Mat 类 (23)创建 Mat 对象 (24)构造函数方法 (24)create()函数创建对象 (25)Matlab 风格的创建对象方法 (26)矩阵的基本元素表达 (26)像素值的读写 (27)at()函数 (28)使用迭代器 (29)通过数据指针 (30)选取图像局部区域 (32)单行或单列选择 (32)用 Range 选择多行或多列 (33)感兴趣区域 (33)取对角线元素 (34)Mat 表达式 (34)Mat_类 (36)Mat 类的内存管理 (38)输出 (40)Mat 与 IplImage 和 CvMat 的转换 (42)Mat 转为 IplImage 和 CvMat 格式 (42)IplImage 和 CvMat 格式转为 Mat (42)第 4 章数据获取与存储 (44)读写图像文件 (44)读图像文件 (44)写图像文件 (45)读写视频 (47)读视频 (47)写视频 (49)第1章预备知识OpenCV 是一个功能强大的计算机视觉库,要用好它,除了要具有相关的计算机视觉理论知识外,还需要具有一定的编程能力。
个人整理的opencv最基本入门资料

---- By Moco Sun 2010.12.19
1. 简介 OpenCV 的全称是:Open Source Computer Vision Library,Intel 公司支持的开源计算机视
觉库,采用 c/c++编写,可以运行在 linux/windows/mac 等操作系统上。Opencv 还提供了 python、ruby、matlab 以及其他语言的接口。
//读取图像宽度 //读取图像高度 //读取图像通道数 //读取图像一行像素所占的字节数
{ pchar = (uchar*)image->imageData + i*widthStep; for (j=0; j<width; j++) { uchar* temp = pchar + j*channel; temp[0] += 10;//通道B temp[1] += 10;//通道G temp[2] += 10;//通道R }
其目标是构建一个简单易用的计算机视觉框架,以帮助开发人员更便捷地设计更复杂的 计算机视觉相关应用程序。Opencv 包含的函数有 500 多个,覆盖了如工厂产品检测、医学 成像、信息安全、用户界面、摄像机标定、立体视觉和机器人等,具体将在下面介绍。 Opencv 使用宽松的 BSD 开源协议,在遵守协议的情况下,允许生成商业产品,不必开发源 代码。
CvSize表示图像的大小,为含两个int的结构体,定义如下
typedef struct CvSize { int width; int height; }
CvSize; 小贴士
Cv与cv的区别:以Cv开头的一般是函数,以cv开头的通常是内联数据元素。 CvPoint结构体不支持默认构造函数,但是可以通过inline的cvPoint(注意首字母小写)函数来创 建一个无名的CvPoint,这在传递一些函数参数经常使用,同理,CvScalar与cvScalar,CvSize与 cvSize等也有这样的用法。
【opencv+python】图像的基本操作:缩放、剪切、位移、旋转、仿射变换
【opencv+python】图像的基本操作:缩放、剪切、位移、旋转、仿射变换1.缩放代码:# 使⽤resize函数实现图⽚缩放import cv2src = cv2.imread("C:/360Downloads/1.jpg", 1)cv2.imshow("src", src)srcInfo = src.shapeheight = srcInfo[0]width = srcInfo[1]dstHeight = int(height * 0.5)dstWidth = int(width * 0.5)dst = cv2.resize(src, (dstWidth, dstHeight))cv2.imshow("dst", dst)cv2.waitKey(0)# 使⽤warpAffine函数实现图⽚缩放import cv2import numpy as npsrc = cv2.imread("C:/360Downloads/1.jpg", 1)cv2.imshow("src", src)srcInfo = src.shapeheight = int(srcInfo[0]/2)width = int(srcInfo[1]/2)# 将图⽚缩⼩为原来的⼀半:# xNew = x * 0.5# yNew = y * 0.5# xNew = x * A1 + y * A2 + B1# yNew = x * A3 + y * A4 + B2# np.float32([[A1, A3, B1],# [A2, A4, B2]])matScale = np.float32([[0.5, 0, 0],[0, 0.5, 0]])dst = cv2.warpAffine(src, matScale, (width, height))cv2.imshow("dst", dst)cv2.waitKey(0)效果:2.剪切代码:# 图⽚剪切import cv2src = cv2.imread("C:/360Downloads/1.jpg", 1) cv2.imshow("src", src)# [⾏,列]dst = src[100:200, 100:300]cv2.imshow("dst", dst)cv2.waitKey(0)效果:3.位移代码:# 图像位移import cv2import numpy as npsrc = cv2.imread("C:/360Downloads/1.jpg", 1)cv2.imshow("src", src)srcInfo = src.shapeheight = srcInfo[0]width = srcInfo[1]# 左移100,下移200:# xNew = x + 100# yNew = y + 200# xNew = x * A1 + y * A2 + B1# yNew = x * A3 + y * A4 + B2# np.float32([[A1, A3, B1],# [A2, A4, B2]])matShift = np.float32([[1, 0, 100], [0, 1, 200]])dst = cv2.warpAffine(src, matShift, (width, height)) cv2.imshow("dst", dst)cv2.waitKey(0)效果:4.旋转代码:# 旋转图像import cv2src = cv2.imread("C:/360Downloads/1.jpg", 1)cv2.imshow("src", src)srcInfo = src.shapeheight = srcInfo[0]width = srcInfo[1]# getRotationMatrix2D 函数可获取旋转的仿射矩阵# 参数依次为(旋转中⼼,旋转⾓度,缩放⽐例)matRotate = cv2.getRotationMatrix2D((0, 0), 45, 0.5) dst = cv2.warpAffine(src, matRotate, (width, height))cv2.imshow("dst", dst)cv2.waitKey(0)效果:5.仿射变换代码:# 仿射变换import cv2import numpy as npsrc = cv2.imread("C:/360Downloads/1.jpg", 1)cv2.imshow("src", src)srcInfo = src.shapeheight = srcInfo[0]width = srcInfo[1]# 三点确定⼀个平⾯# getAffineTransform 函数可获取仿射矩阵# 参数依次为(源图像的三点坐标,⽬标图像的三点坐标)# 三点分别为(左上⾓,左下⾓,右上⾓)matSrc = np.float32([[0, 0], [0, height - 1], [width - 1, 0]])matDst = np.float32([[50, 50], [150, height - 100], [width - 100, 150]]) matAffine = cv2.getAffineTransform(matSrc, matDst)dst = cv2.warpAffine(src, matAffine, (width, height))cv2.imshow("dst", dst)cv2.waitKey(0)效果:。
python中opencv的用法
python中opencv的用法
OpenCV 是一个开源的计算机视觉库,广泛应用于图像处理、视频分析、人脸识别等领域。
在 Python 中使用 OpenCV,可以通过以下步骤进行:
1. 安装 OpenCV:首先需要在系统中安装 OpenCV。
可以使用 pip 命令进行安装,例如:
```
pip install opencv-python
```
2. 导入 OpenCV 模块:在 Python 代码中,可以使用以下语句导入 OpenCV 模块:
```python
import cv2
```
3. 加载图像:OpenCV 提供了多种加载图像的方法,其中最常用的是使用 cv2.imread()函数。
该函数接受一个字符串参数,表示图像的路径,并返回一个代表图像的矩阵。
```python
image = cv2.imread('image.jpg')
```
4. 操作图像:OpenCV 提供了丰富的图像操作函数,例如:
- 改变图像大小:使用 cv2.resize()函数。
- 翻转图像:使用 cv2.flip()函数。
- 旋转图像:使用 cv2.rotate()函数。
- 提取图像特征:使用 cv2.Canny()函数。
5. 保存图像:使用 cv2.imwrite()函数可以将图像保存到文件中。
以上是 OpenCV 在 Python 中的基本用法,你可以根据实际需求进一步学习和使用OpenCV 中的其他函数。
opencv4应用开发-入门,进阶与工程化实践
opencv4应用开发-入门,进阶与工程化实践引言随着计算机视觉技术的飞速发展,OpenCV已成为计算机视觉领域的核心库。
OpenCV4在图像处理、目标检测、机器学习等领域的应用日益广泛。
本文将带领大家从入门到进阶,再到工程化实践,深入探索OpenCV4的魅力。
第一部分:入门篇1.1 OpenCV4简介首先,我们来了解一下OpenCV4。
OpenCV是一个开源的计算机视觉库,包含了大量的图像处理和计算机视觉的算法。
OpenCV4在保持原有功能的基础上,进一步优化了算法性能,并增加了许多新的功能模块。
1.2 环境配置在开始OpenCV的学习之前,我们需要配置好开发环境。
这包括安装OpenCV 库、选择合适的编程语言(如Python、C++等)以及相应的开发工具(如PyCharm、Visual Studio等)。
1.3 基本操作在掌握了环境配置后,我们可以开始学习OpenCV的基本操作,如图像的读取、显示、保存等。
通过这些基础操作,我们可以对图像进行简单的处理,如灰度转换、噪声去除等。
第二部分:进阶篇2.1 图像处理算法在掌握了基本操作后,我们可以进一步学习OpenCV提供的各种图像处理算法,如滤波、边缘检测、形态学处理等。
这些算法可以帮助我们更好地理解和处理图像。
2.2 目标检测与跟踪目标检测和跟踪是计算机视觉的重要应用之一。
OpenCV提供了多种目标检测和跟踪的方法,如Haar级联、HOG+SVM、深度学习模型等。
通过这些方法,我们可以实现人脸检测、行人检测等功能。
2.3 机器学习与计算机视觉近年来,机器学习在计算机视觉领域的应用越来越广泛。
OpenCV4结合了多种机器学习算法,如支持向量机、随机森林等,使得我们可以在计算机视觉任务中更好地利用机器学习的能力。
第三部分:工程化实践篇3.1 项目管理与团队协作在大型项目中,良好的项目管理至关重要。
我们需要根据项目的需求,制定合适的开发计划,并进行有效的团队协作。
OpenCV常用操作之计时、缩放、旋转、镜像
常用操作在OpenCV开发过程中用于测试性能计时的:计时(计算处理的时间)。
在一般的图像处理中有的几个操作:缩放(放大、缩小),旋转(90度的倍数)、镜像(x轴反向、y轴反向)。
注意:意角度的旋转使用cv::Mat不太合适,开发过程中会用到其他ui框架,所以使用其他ui框架做旋转是比较合适的。
计时函数OpenCV提供了两个渐变的计时函数:getTickCount()和getTickFrequency()。
getTickCount():getTickCount()函数返回CPU自某个事件(如启动电脑)以来走过的时钟周期数。
getTickFrequency():getTickFrequency()函数返回CPU一秒钟所走的时钟周期数。
测试结果如下:cv::getTickFrequency()获取的频率为10,000,000,得到cpu的周期为一千万次每秒。
访问图像中像素的三类方法cv::Mat访问的三类方法:方法一:at函数方法二:使用迭代器方法三:通过数据指针旋转(90度的整数倍)旋转90°的整数就是对矩阵位置进行变换,如下图:旋转函数1:cv::transpose()该函数无任何函数,直接对矩阵进行顺时钟旋转90°,函数原型如下:CV_EXPORTS_W void transpose(InputArray src, OutputArray dst);旋转函数2:cv::rotate()该函数旋转函数,三个枚举可以旋转90°,180°,270°,逆时针旋转90°就是顺时钟270°,函数原型如下:CV_EXPORTS_W void rotate(InputArray src, OutputArray dst, int rotateCode);参数一:输入mat参数二:输出mat参数三:旋转枚举,如下:enum RotateFlags {ROTATE_90_CLOCKWISE = 0, //Rotate 90 degrees clockwiseROTATE_180 = 1, //Rotate 180 degrees clockwiseROTATE_90_COUNTERCLOCKWISE = 2, //Rotate 270 degrees clockwise};代码示例:cv::rotate(srcMat, srcMat, cv::ROTATE_90_CLOCKWISE);镜像(x轴翻转,y轴翻转)镜像就是对X轴和Y轴的值翻转对调,如下图:翻转函数:cv::flip该函数为翻转函数,函数圆形如下:CV_EXPORTS_W void flip(InputArray src, OutputArray dst, int flipCode);参数一:输入mat参数二:输出mat参数三:只有3种值,小于0,等于0,大于0,分别对应xy轴翻转、x轴翻转、y轴翻转。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验六 OPENCV的基本操作张慧彬2013-8-24机器人研究中心目录一.OPENCV的基本算法及一般应用 (2)1.从磁盘加载并在屏幕上显示图象 (2)2.播放AVI视频 (3)3.视频播放控制 (4)4.载入一幅图象并进行平滑处理 (6)二.调试OPTICAL_FLOW_DEMO.CPP程序 (7)三.OENCV的应用之CANNY边缘检测 (8)1. C ANNY边缘检测基本原理 (8)2.C ANNY边缘检测流程 (8)四.试验总结及心得 (12)一. Opencv的基本算法及一般应用1.从磁盘加载并在屏幕上显示图象#include”highgui.h”int main(int argc,char** argv);{IplImage *img=cvLoadImage(agrv[1]); //将图像文件加载至内存,cvLoadImage()函数是一个高层调用接口,它通过文件名确定被加载文件的格式,。
IplImage结构体将是我们在使用OpenCV时会最常用到的数据结构cvNamedWindow(”Example 1”,CV_WINDOW_AUTOSIZE); // cvNamedWindow()函数用于在屏幕上创建一个窗口,将被显示的图像包含于该窗口中。
函数的第一个参数指定了该窗口的窗口标题,cvNamedWindow()函数的第二个参数定义了窗口的属性。
该参数可被设置为0(默认值)或CV_WINDOW_AUTOSIZE,设置为0时,窗口的大小不会因图像的大小而改变,图像只能在窗口中根据窗口的大小进行拉伸或缩放;而设置为CV_WINDOW_AUTOSIZE时,窗口则会根据图像的实际大小自动进行拉伸或缩放,以容纳图像cvShowImage(”Example 1”,img);// 只要有一个与某个图像文件相对应的IplImage*类型的指针,我们就可以在一个已创建好的窗口(使用cvNamedWindow()函数创建)中使用cvShowImage()函数显示该图像。
cvShowImage()函数通过设置其第一个参数确定在哪个已存在的窗口中显示图像。
cvShowImage()函数被调用时,该窗口将被重新绘制,并且图像也会显示在窗口中。
如果该窗口在创建时被指定CV_WINDOW_AUTOSIZE标志作为cvNamedWindow()函数的第二个参数,该窗口将根据图像的大小自动调整为与图像一致。
cvWaitKey(0);// 使程序暂停,等待用户触发一个按键操作。
但如果将该函数参数设为一个正数,则程序将暂停一段时间,时间长为该整数值个毫秒单位,然后继续执行程序,即使用户没有按下任何键。
当设置该函数参数为0或负数时,程序将一直等待用户触发按键操作。
cvReleaseImage(&img);// 通过为cvReleaseImage()函数传递一个类型为IplImage*的指针参数调用该函数,用以执行内存释放操作。
对cvReleaseImage()函数的调用执行完毕后,img指针将被设置为NULLcvDestroyWindow(“Example 1”);// cvDestroyWindow()函数将关闭窗口,并同时释放为该窗口所分配的所有内存(包括窗口内部的图像内存缓冲区,该缓冲区中保存了与img指针相关的图像文件像素信息的一个副本)}2. 播放AVI视频#include”highgui.h”int main(int argc,char **argv){cvNamedWindow(“Example 2”,CV_WINDOW_AUTOSIZE);CvCapture *capture=cvCreatFileCapture (argv[1]); // 函数cvCreateFileCapture()通过参数设置确定要读入的AVI文件,返回一个指向CvCapture结构的指针。
这个结构包括了所有关于要读入AVI文件的信息,其中包含状态信息。
在调用这个函数后,返回指针所指向的CvCapture结构被初始化到所对应AVI 文件的开头。
IplImage *frame;While(1){ frame=cvQueryFrame(capture);// 一旦进入while(1)循环,我们便开始读入AVI文件,cvQueryFrame的参数为CvCapture结构的指针。
用来将下一帧视频文件载入内存(实际是填充或更新CvCapture结构中)。
返回一个对应当前帧的指针If(!frame) break;cvShowImage(“Example 2”,frame);char c=cvWaitKey(33);if (c==27) break;}cvReleaseCapture(&capture);// 退出循环体(视频文件已经读入结束或者用户触发了Esc键)后,我们应该释放为CvCapture结构开辟的内存空间,这同时也会关闭所有打开的AVI文件相关的文件句柄。
cvDestroyWindow(“Example 2”);}3. 视频播放控制滚动条可以使我们方便地从视频的一帧跳到另外一帧。
我们通过调用cvCreateTrackbar()来创建一个滚动条,并且通过设置参数确定滚动条所属于的窗口。
为了获得所需的功能,只需要提供一个回调函数。
拖动滚动条,函数onTrackSlide()便被调用并被传入滚动条新的状态值.从本质上说,这种方法是通过添加一个全局变量来表示滚动条位置并且添加一个回调函数更新变量以及重新设置视频读入位置。
我们通过一个调用来创建滚动条和确定回调函数#include”cv.h”#include”highgui.h”int g_slider_position=0;CvCapture *capture=NULL;//首先为滚动条位置定义一个全局变量。
由于回调函数需要使用CvCapture对象,因此我们将它定义为全局变量void onTrackbarSlide(int pos){ cvSetCaptureProperty( g_capture,CV_CAP_PROP_POS_FRAMES,pos);} //现在我们定义一个回调函数,使其在滚动条被拖动时调用。
滚动条的位置会被作为一个32位整数以参数形式传入。
后面我们会常常看到函数cvSetCaptureProperty()被调用,同时与之配套的函数cvGetCaptureProperty()也经常会被调用。
这些函数允许我们设置(或查询)CvCapture对象的各种属性。
在本程序中我们设置参数CV_CAP_PROP_POS_ FRAMES(这个参数表示我们以帧数来设置读入位置,如果我们想通过视频长度比例来设置读入位置,我们可以通过用AVI_RATIO代替FRAMES来实现)。
最后,我们把新的滚动条位置作为参数传入int main(int argc,char**argv){ cvNamedWindow(“Example 3”,CV_WINDOW_AUTOSIZE);g_capture=cvCreatFileCapture(argv[1]);int frames=(int) cvGetCaptureProperty( g_capture,CV_CAP_PROP_FRAME_COUNT);// 当需要从CvCapture结构查询数据时,可使用cvGetCaptureProperty函数if(frames!=0){ cvCreateTrackbar( “position”,“Example 3”,&g_slider_position,frames,onTrackbarSlide);}//前面的代码用来创建滚动条,借助函数cvCreateTrackbar(),我们可设置滚动条的名称并确定滚动条的所属窗口。
我们将一个变量绑定到这个滚动条来表示滚动条的最大值和一个回调函数(不需要回调函数时置为空,当滚动条被拖动时触发)。
仔细分析,你会发现一点:cvGetCaptureProperty()返回的帧数为0时,滚动条不会被创建。
这是因为对于有些编码方式,总的帧数获取不到,在这种情况下,我们只能直接播放视频文件而看不到滚动条IplImage*frame;// While loop (as in Example 2) capture & show video// Release memory and destroy windowreturn(0);}4. 载入一幅图象并进行平滑处理.#include”cv.h”#include”highgui.h”void example2_4(IplImage *image){ cvNamedWindow(“example4-in”);cvNamedWindow(“example4-out”); //creat some windows to show the input and output images incvShowImage(“example4-in”,image);//show our input imageIplImage*out=cvCreatImage(cvGetSize(image),IPL_DEPTH_8U,3);//creat an image to hold the smooth output 。
第一个参数是一个CvSize结构,这个结构可以通过cvGetSize(image)方便地获得;第一个参数说明了当前图像结构的大小。
第二个参数告诉了我们各通道每个像素点的数据类型,最后一个参数说明了通道的总数。
所以从程序中可以看出,当前图像是3个通道(每个通道8位),图像大小同image。
cvSmooth(image,out,CV_GAUSSIAN,3,3);//do the smooth 我们通过使用每个像素周围3*3区域进行高斯平滑处理cvShowImage(“example4-out”,out);//show the smoothed image in the output windowcvReleaseImage(&out);//be tidy 现在我们可以在我们新窗口中显示处理后的图像然后释放它:cvReleaseImage()通过给定一个指向IplImage*的指针来释放与图像对应的内存空间。
cvWaitKey(0);//wait for the user to hit a key ,then clean up the windowscvDestroyWindow(“example4-in”);cvDestroyWindow(“example4-out”);}二.调试optical_flow_demo.cpp程序此程序是稀疏光流演示程序,对物体进行视频跟踪处理,在代码中可以看出这是只是一个内联图像分配。