OPENCV之头文件分析
- 格式:pdf
- 大小:113.67 KB
- 文档页数:6
OpenCV是Intel开源计算机视觉库。
它由一系列C 函数和少量C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV 拥有包括300 多个C函数的跨平台的中、高层API。
它不依赖与其它的外部库,尽管也可以使用某些外部库。
OpenCV 对非商业应用和商业应用都是免费(FREE)的。
在VC6.0中利用OpenCV进行开发视觉,首先,需要将OpenCV正确的配置到VC开发环境中。
主要是设置预先编译的头文件的路径与动态链接库的路径。
一在VC编译器下,在Project菜单下选择setting,弹出对话框。
1 设置预编译的头文件选择C/C++【Category】,在下拉菜单中选择Preprocessor,然后在A dditional Include directories 中输入以下几项:C:\Program Files\OpenCV\cv\include (根据本人机器上OpenCV的安装路径进行设置,如在D盘,则写D: ,以下同)C:\Program Files\OpenCV\otherlibs\highguiC:\Program Files\OpenCV\cxcore\include(新版本需要)C:\Program Files\OpenCV\otherlibs\cvcam\include每一条之间用逗号隔开。
其中C:\Program Files\Intel\opencv为OpenC V的安装路径,这是通用的安装路径,建议最好采用这种设置,以方便大家交流;不然,每次都要重新设置路径,比较麻烦。
2 设置链接库在Link按键下的Category下拉菜单中选择Input选项(指定要连接的库文件,放弃连接的库文件hao ),在Additional library path中,输入:C:\Program Files \OpenCV\lib最后在Setting For下拉菜单中依次选择Win32 Debug和Win32 Releas e,分别在Object /library modules 输入:cv.lib highgui .lib cxcore.lib cvcam.lib注意每个库之间用一个空格隔开。
C语⾔中头⽂件和cpp⽂件解析回到cpp⽂件与头⽂件各写什么内容的话题上:理论上来说cpp⽂件与头⽂件⾥的内容,只要是C语⾔所⽀持的,⽆论写什么都可以的,⽐如你在头⽂件中写函数体实现,任何⼀个cpp⽂件包含此头⽂件就可以将这个函数编译成⽬标⽂件的⼀部分(编译是以cpp⽂件为单位的,如果不在任何cpp⽂件中包含此头⽂件的话,这段代码就形同虚设),你可以在cpp⽂件中进⾏函数声明、变量声明、结构体声明,这也不成问题那为何⼀定要分成头⽂件与cpp⽂件呢?⼜为何⼀般都在头件中进⾏函数、变量声明,宏声明,结构体声明呢?⽽在cpp⽂件中去进⾏变量定义,函数实现呢??原因如下: 1.如果在头⽂件中实现⼀个函数体,那么如果在多个cpp⽂件中引⽤它,⽽且⼜同时编译多个cpp⽂件,将其⽣成的⽬标⽂件连接成⼀个可执⾏⽂件,在每个引⽤此头⽂件的cpp⽂件所⽣成的⽬标⽂件中,都有⼀份这个函数的代码,如果这段函数⼜没有定义成局部函数,那么在连接时,就会发现多个相同的函数,就会报错,函数重复定义。
2.如果在头⽂件中定义全局变量,势必会对此全局变量赋初值,那么在多个引⽤此头⽂件的cpp⽂件中同样存在相同变量名的拷贝,关键是此变量被赋了初值,所以编译器就会将此变量放⼊DATA段,最终在连接阶段,会在DATA段中存在多个相同的变量,它⽆法将这些变量统⼀成⼀个变量,统⼀变量的意思也就是仅为此变量分配⼀个空间,⽽不是多份空间。
但是对于声明⼀个变量,这个变量在头⽂件没有赋初值,编译器就会将之放⼊BSS段,连接器会对BSS段的多个同名变量仅分配⼀个存储空间。
3.如果在cpp⽂件中声明宏、结构体、函数等,那么我要在另⼀个cpp⽂件中引⽤相应的宏、结构体、函数,就必须再做⼀次重复的⼯作(意思是说如果不去#include),如果我改了⼀个cpp⽂件中的⼀个声明,那么⼜忘了改其它cpp⽂件中的声明,这不就出了⼤问题了,程序的逻辑就变成了你不可想象的了,如果把这些公共的东东放在⼀个头⽂件中,想⽤它的cpp⽂件就只需要引⽤⼀个就OK了这样岂不⽅便,要改某个声明的时候,只需要动⼀下头⽂件就⾏了。
OpenCV读写视频文件解析(二)OpenCV读写视频文件解析(二)VideoCapture::set设置视频捕获中的属性。
C :bool VideoCapture::set(int propId, double value)Python:cv2.VideoCapture.set(propId, value) → retvalC:int cvSetCaptureProperty(CvCapture* capture, int property_id, double value)Python:cv.SetCaptureProperty(capture, property_id, value) → retvalParameters:•propId–Property identifier. It can be one of the following:o CV_CAP_PROP_POS_MSEC Current position of the video file in milliseconds.o CV_CAP_PROP_POS_FRAMES 0-based index of the frame to be decoded/captured next.o CV_CAP_PROP_POS_AVI_RATIO Relative position of the video file: 0 - start of the film, 1 - end of the film.o CV_CAP_PROP_FRAME_WIDTH Width of the frames in the video stream.o CV_CAP_PROP_FRAME_HEIGHT Height of the frames in the video stream.o CV_CAP_PROP_FPS Frame rate.o CV_CAP_PROP_FOURCC 4-character code of codec.o CV_CAP_PROP_FRAME_COUNT Number of frames in the video file.o CV_CAP_PROP_FORMAT Format of the Mat objects returned by retrieve() .o CV_CAP_PROP_MODE Backend-specific value indicatingthe current capture mode.o CV_CAP_PROP_BRIGHTNESS Brightness of the image (onlyfor cameras).o CV_CAP_PROP_CONTRAST Contrast of the image (only forcameras).o CV_CAP_PROP_SATURATION Saturation of the image (onlyfor cameras).o CV_CAP_PROP_HUE Hue of the image (only for cameras).o CV_CAP_PROP_GAIN Gain of the image (only for cameras).o CV_CAP_PROP_EXPOSURE Exposure (only for cameras).o CV_CAP_PROP_CONVERT_RGB Boolean flags indicatingwhether images should be converted to RGB.o CV_CAP_PROP_WHITE_BALANCE_U The U value of thewhitebalance setting (note: only supported by DC1394 v 2.xbackend currently)o CV_CAP_PROP_WHITE_BALANCE_V The V value of thewhitebalance setting (note: only supported by DC1394 v 2.xbackend currently)o CV_CAP_PROP_RECTIFICATION Rectification flag forstereo cameras (note: only supported by DC1394 v 2.x backendcurrently)o CV_CAP_PROP_ISO_SPEED The ISO speed of the camera(note: only supported by DC1394 v 2.x backend currently)o CV_CAP_PROP_BUFFERSIZE Amount of frames stored ininternal buffer memory (note: only supported by DC1394 v2.x backend currently)•value– Value of the property.参数:propId -属性标识符。
读入图像﹑显示图像和保存图像是图像处理过程中最基本的,也是必不可少的操作.配置好OpenCV以后,包含以下两个头文件:#include "cv.h"#include "highgui.h"IplImage* image=cvLoadImage("D:\\123.jpg",-1);//函数cvLoadImage()的第1个参数是图像文件的路径.//第2个参数是读取图像的方式:-1表示按照图像本身的类型来读取,1表示强制彩色化,0表示//强制灰值化.if(image==NULL){MessageBox("无法读取图像数据!", "提示",MB_OK);//在MFC工程中这样用//若在win32控制台程序中,用printf("无法读取图像数据!\n");return;//不作任何操作,就不会执行后面的程序了}cvNamedWindow("图像显示",CV_WINDOW_AUTOSIZE);//该函数的功能是按照指定方式创建一个窗口,用于显示图像.//第1个参数是窗口的名称,自己可以任意设置//第2个参数表示窗口的大小会自动根据图像尺寸而变化cvShowImage("图像显示",image);//该函数的功能是在指定的窗口上显示图像.//第1个参数是显示图像窗口的名称//第2个参数是要显示的图像cvSaveImage("D:\\saveImage.jpg",image);//该函数的功能是将图像另存为//第1个参数是保存的路径,自己可以设置其它路径//第2个参数是要保存的图像cvWaitKey(0);//一直等待按键没有这句的话图像不能正常显示cvReleaseImage(&image);//释放图像内存cvDestroyWindow("图像显示");//销毁窗口资源//读取和显示完图像之后,要及时释放所占的内存资源.运行示例:。
opencvffmpeg详细解析OpenCV是一个开源的计算机视觉库,而FFmpeg是一个开源的音视频处理工具包。
两者结合使用可以实现强大的音视频处理功能。
本文将详细解析OpenCV和FFmpeg的结合使用。
OpenCV是一个广泛应用于计算机视觉领域的库,它提供了丰富的图像和视频处理函数。
通过OpenCV,可以轻松读取、处理和显示图像和视频。
而FFmpeg则是一个专注于音视频处理的工具包,它提供了丰富的音视频编解码、转换、过滤等功能。
在使用OpenCV和FFmpeg结合进行音视频处理时,首先需要确保已经正确安装了OpenCV和FFmpeg,并且编译时已经将它们绑定在一起。
然后,可以通过以下步骤进行音视频处理:1. 打开视频文件:可以使用FFmpeg提供的函数打开视频文件,并获取视频流的相关信息,如分辨率、帧率等。
2. 读取视频帧:使用OpenCV的函数读取视频帧,可以通过指定帧索引或时间戳来读取指定位置的帧。
3. 进行图像处理:可以使用OpenCV提供的图像处理函数对读取的视频帧进行各种操作,如图像增强、滤波、边缘检测等。
4. 进行视频处理:可以使用OpenCV提供的视频处理函数对读取的视频帧进行各种操作,如运动估计、目标检测、视频合成等。
5. 编码和保存:使用FFmpeg提供的编码函数将处理后的视频帧进行编码,并保存为指定的格式和文件。
通过以上步骤,可以实现各种音视频处理功能,如实时视频处理、视频编辑、视频转码等。
而OpenCV和FFmpeg的结合使用不仅可以提供丰富的处理功能,还可以充分发挥它们各自的优势,实现更高效的处理效果。
需要注意的是,在使用OpenCV和FFmpeg进行音视频处理时,需要注意以下几点:1. 输入输出格式的兼容性:要确保输入的视频格式与OpenCV和FFmpeg支持的格式兼容,否则可能无法正常处理。
2. 内存管理:在处理大规模的视频数据时,需要注意内存的管理,避免因内存不足导致程序崩溃。
数据存储OpenCV提供了一种机制来序列化(serialize)和去序列化(de-serialize)其各种数据类型,可以从磁盘中按YAML或XML格式读/写。
在第4章中,我们将专门介绍存储和调用常见的对象IplImages的函数(cvSaveImage()和cvLoadImage())。
此外,第4章将讨论读/写视频的特有函数:可以从文件或者摄影机中读取数据的函数cvGrabFrame()以及写操作函数cvCreateVideoWriter()和cvWriteFrame()。
本小节将侧重于一般对象的永久存储:读/写矩阵、OpenCV结构、配置与日志文件。
首先,我们从有效且简便的OpenCV矩阵的保存和读取功能函数开始。
函数是cvSave()和cvLoad()。
例3-15展示了如何保存和读取一个5×5的单位矩阵(对角线上是1,其余地方都是0)。
例3-15:存储和读取CvMat1.CvMat A= cvMat( 5, 5, CV_32F, the_matrix_data );2.3.cvSave( "my_matrix.xml", &A );4.. . .5.// to load it then in some other program use …6.CvMat* A1= (CvMat*) cvLoad( "my_matrix.xml" );CxCore参考手册中有整节内容都在讨论数据存储。
首先要知道,在OpenCV中,一般的数据存储要先创建一个CvFileStorage结构(如例3-16)所示,该结构将内存对象存储在一个树形结构中。
然后通过使用CV_STORAGE_READ参数的cvOpenFileStorage()从磁盘读取数据,创建填充该结构,也可以通过使用CV_STORAGE_WRITE的cvOpenFileStorage()创建并打开CvFileStorage写数据,而后使用适当的数据存储函数来填充它。
头⽂件的作⽤分析问题引⼊假设有⼀个C/C++语⾔项⽬,项⽬中包含了很多模块,每个模块中⼜包含了很多功能函数。
对于这个项⽬,稍稍学习过编程知识的开发者都会将模块做成动态或者静态库。
在动态或者静态库中,往往包含了很多头⽂件和源⽂件。
现在思考⼀个问题,为什么需要头⽂件?似乎从开始学习编程开始⽼师就教导我们要写头⽂件和源⽂件,但是有没有认真思考过它们的作⽤?本篇来通过⼀个简单例⼦来简要分析⼀下头⽂件的作⽤。
背景介绍为了简化问题,我们假设需要开发⼀个可执⾏项⽬,在这个项⽬中需要⼀个模块,这个模块中仅仅包含两个函数,它们的作⽤就是打印出传⼊的参数值。
代码如下:1 #include <stdio.h>23void test(int val)4 {5 printf("test : %d\n", val);6 }78void fun(int val)9 {10 printf("fun : %d\n", val);11 }再增加main函数,代码如下:1int main(int argc, char* argv[])2 {3 test(123);4 fun(456);5return0;6 }不划分模块最简单的情况就是将这个模块和main函数写在⼀个⽂件中,但是我们都知道这样做不但模块⽆法重⽤,同时也会给后⾯扩充功能带来繁重的⼯作。
划分模块,可以将功能封装,隐藏实现细节,还可以更好的实现模块复⽤,并且独⽴模块间的低耦合也为了扩展升级提供了便利。
将这个源⽂件编译:gcc -o nomodule main.c使⽤头⽂件加⼊头⽂件test.h,代码如下:1 #ifndef TEST_H_2#define TEST_H_34void test(int val);5void fun(int val);67#endif//TEST_H_修改main.c,代码如下:1 #include "test.h"23int main(int argc, char* argv[])4 {5 test(123);6 fun(456);7return0;8 }重新编译gcc -o header main.c test.c执⾏程序,可以看到效果。
OpenCV源码架构讲解1. Core(核心):此模块包含了OpenCV的核心功能,如矩阵操作、数据类型、数组和向量运算等。
该模块提供了基础的数据结构和函数,为其他模块的实现提供支持。
2. Imgproc(图像处理):此模块提供了各种图像处理函数,如滤波、边缘检测、图像变换等。
它包含了大量的图像处理算法,并提供了丰富的工具函数,方便用户进行图像处理操作。
3. Highgui(图形用户界面):该模块提供了图形用户界面相关的函数,如图像显示、鼠标事件处理、键盘事件处理等。
它可以帮助用户在图像处理过程中进行交互操作,方便调试和分析。
4. Video(视频处理):此模块提供了与视频处理相关的函数,如视频捕捉、视频压缩、视频写入等。
它支持从摄像机、文件或其他源中读取视频流,并提供了一系列的视频处理算法。
5. Objdetect(对象检测):该模块提供了对象检测相关的函数,如人脸检测、行人检测等。
它提供了训练好的模型和相应的算法,可以用于识别和跟踪不同种类的对象。
此外,OpenCV还包含了一些辅助模块,如ml(机器学习)、calib3d (相机标定和三维重建)、features2d(特征检测和描述子)、videoio (视频IO)、flann(最近邻)等。
OpenCV的源码采用模块化的结构,使得用户可以灵活地选择所需的模块,以适应不同的应用场景。
每个模块都有自己的命名空间和头文件,以避免命名冲突。
同时,源码还提供了丰富的示例和文档,方便用户使用和理解。
在OpenCV的源码中,各个模块之间存在着一定的依赖关系,需要进行编译和链接才能生成可执行文件。
此外,OpenCV还提供了对Python、Java等语言的接口,使得用户可以在不同的平台上使用OpenCV。
总之,OpenCV的源码架构是基于C++实现的,模块化设计使得用户可以方便地选择所需的功能模块。
各个模块之间存在着一定的依赖关系,通过编译和链接可以生成可执行文件。