如何开始一个简单的OpenCV程序
- 引子
最近刚刚开始接触OpenCV,在这里把自己学习过程中的收获和问题写在这里与大家一起分享讨论,毕竟一个人的力量和精力有限,希望与大家一起共勉。
声明:1.本人也是初学,水平有限,如有错误之处,欢迎大家批评指正。
2.环境:Win7 ultimate 64bit + VS2010 + OpenCV2.4.3。
- Chapter 1:介绍
在这篇博文中将为大家介绍OpenCV基础原理以及向大家展示如何完成最基础的一些任务:例如读取,显示和保存图片等。在开始编写OpenCV程序之前,需要先安装OpenCV Library,同时你也需要一个好的环境(IDE),在这里我用的是Microsoft Visual Studio 2010。
- Chapter 2:安装OpenCV Library
OpenCV是一个用来开发计算机视图应用程序的开源库,其可用在大学或者商业程序中,在BSD证书下允许免费使用,传播或者改编它。这一节将说明如何安装OpenCV Library。
2.1 准备工作
访问OpenCV的官方网站可以找到最新的发行包以及在线文档和许多其他跟OpenCV有关的资源。
注:这里强烈建议大家下载新版的OpenCV Library,因为2.3以后的版本安装时会自动生成一个Build文件夹,里面有编译好的Lib和DLL,可以直接使用,如果是2.3之前的版本,则需要自己手动编译,编译的过程还是较为繁琐的,这里就不一一介绍了。而且版本越新功能也就越强大,何乐而不为呢?
2.2 安装
从官网的下载界面里找到相应的平台,这里我们选择Windows,下好安装包之后解压能看到一个build文件夹,里面包含了要用到的模块。具体安装之后的目录如下图(安装过程很简单,选择一个要解压到的文件夹即可,这里就不具体说明了):
(接下来这一步可以不做,但是后章中提到包含头文件和库文件的时候要注意选择相应的目录)新建一个OpenCV的目录,可以在这目录下再新建不同的文件夹来存放不同版本的文件,这里为了方便把需要用到的文件:include文件夹和X64下的文件夹拷贝到刚刚新建好的文件夹里(如果是32bit的系统就拷贝X86下的文件夹),我是放在C:\Program Files\OpenCV\VS2010文件夹下,最后的结果如下图(如果是VS2008则拷贝VC9目录代替VC10):
2.3 OpenCV是如何工作的
从2.2版本开始,OpenCV Library分成了几个模块,这些模块编译生成的Library文件都被放在“lib”目录下,它们分别是:
opencv_core:包含库的核心功能,特别是基本数据结构和算法逻辑函数。
opencv_highgui:包含图像,视频的读写功能函数和其他的用户接口函数。
opencv_imgproc:包含图像处理函数。
opencv_features2d:表明检测器,描述器和匹配的框架等特征。
opencv_calib3d:包含摄像校对,二维几何估值,三维立体处理函数等。
opencv_vidio:包含了动态预测,特征跟踪以及前景提取的函数和类。
opecv_objdetect:包含对象检测函数,例如人脸识别等。
当然,还包括其他一些功能的库,像opencv_ml,opencv_flann,opencv_contrib,opencv_legacy,opencv_gpu等。
在include同文件中有与这些模块相关联的头文件,一般OpenCV C++代码开始的时候都要包含所需的模块头文件,例如(推荐用这样的形式来声明):
1: #include <opencv2/core/core.hpp>2: #include <opencv2/imgproc/imgproc.hpp>3: #include <opencv2/highgui/highgui.hpp>如果你看到下面这种OpenCV代码:
1: #include “cv.h"这是因为它用了在OpenCV库重组成模块之前的格式。
- Chapter 3:创建OpenCV的工程:
这一节来向大家展示怎么创建一个简单的OpenCV工程,首先,通过VS2010的File|New Project|Project…菜单选项新建一个工程,这里选择Win32 Console Application(Win32 控制台程序),如下图:
点击OK,然后点击next
接下来选择Empty project,点击finish:
这样我们就创建了一个空的OpenCV的工程,首先,在编译和运行OpenCV程序之前,需要先告诉Visual C++去哪里找OpenCV的库和头文件,由于将来我们可能会创建一些OpenCV的工程,所以在这里最好的做法是创建一个属性表,这个属性表可以重用在其他的OpenCV工程中,这样我们就不需要每次编写OpenCV工程的时候去配置库和头文件目录了。打开Property Manager(属性管理器,如果找不到可以通过View|Property Manager打开)。
在Visual C++ 2010中,属性表是一个描述工程设置的XML文件,通过右键点击Debug|Win32,选择Add New Project Property Sheet选项,可以见到下图:
点击Add按钮后,就添加了一张属性表,现在我们要对它进行编辑,双击刚刚新建好的属性表,选择VC++ Directories,如下图:
编辑Include Directories文本框,添加OpenCV库头文件所在的include路径(以各位自己安装OpenCV的路径为准),如下图(下图是我自己的路径):
同样处理Library Directories,这次我们添加OpenCV的库文件路径:
下一步要指明代码需要链接的OpenCV库文件来生成可执行程序。根据应用程序的不同需要不同的OpenCV模块,因为我们希望属性表可以被重用在所有的OpenCV工程中,我们简单的添加几个需要用到的库模块,在Input文本框中选择Linker节点,如下图:
编辑Additional Dependencies文本框然后添加下面的库模块:
注意这里我们指定的库名字末尾有个字母"d”,这说明是Debug模式,我们需要创建另外一个Release模式的属性表,重复上面的步骤,不过需要在Release|Win32节点下添加,在添加库木块的时候,不需要在末尾加上字母"d”,如下图:
接下来我们准备创建,编译和运行第一个OpenCV应用程序。在Solution Explorer中,右击Source Files节点,选择Add New Item…创建一个main.cpp的C++文件。然后我们在main.cpp中添加如下代码:
1: #include <iostream>2: #include <opencv2/core/core.hpp>3: #include <opencv2/highgui/highgui.hpp>4: using namespace std;5: using namespace cv;6:
7: int main( int argc, char** argv )8: {
9: //read an image10: if ( argc != 2 )11: {
12: cout << "Usage: display_image ImageToLoadAndDisplay" << endl;13: return -1;14: }
15:
16: Mat image;
17: cout << "size: " << image.size().height << " , "18: << image.size().width << endl;
19:
20: // Read the file21: image = imread(argv[1], CV_LOAD_IMAGE_COLOR);
22:
23: // Check for invalid input24: if (!image.data)25: {
26: cout << "Could not open or find the image" << endl;27: return -1;28: }
29:
30: // Create a window for display.31: namedWindow( "Display window", CV_WINDOW_AUTOSIZE );32:
33: // Show our image inside it.34: imshow("Display window", image);35:
36: //Wait for a keystroke in the window37: waitKey(0);
38:
39: return 0;40: }
现在要设置输入图片的位置,在Solution Explorer中,右击OpenCVConsole工程名,选择Property,在Debugging节点中的Command Arguments文本框中输入图片的全路径,如下图:
然后按Ctrl+F5看下运行的效果吧!
- Chapter 4 总结及问题
在上述开发过程中遇到一个问题,如果将上述的代码改成图片路径不通过参数传递,而是指定一个图片,并将该图片放在相应的Debug或Release目录下,则会出现错误,希望大家如果能解决这个问题的告诉我解决方法,谢谢。附代码和图:
1: #include <iostream>2: #include <opencv2/core/core.hpp>3: #include <opencv2/highgui/highgui.hpp>4: using namespace std;5: using namespace cv;6:
7: int main( void )8: {
9: //read an image10:
11: Mat image;
12: cout << "size: " << image.size().height << " , "13: << image.size().width << endl;
14:
15: // Read the file16: image = imread("1.jpg", CV_LOAD_IMAGE_COLOR);17:
18: // Check for invalid input19: if (!image.data)20: {
21: cout << "Could not open or find the image" << endl;22: return -1;23: }
24:
25: // Create a window for display.26: namedWindow( "Display window", CV_WINDOW_AUTOSIZE );27:
28: // Show our image inside it.29: imshow("Display window", image);30:
31: //Wait for a keystroke in the window32: waitKey(0);
33:
34: return 0;35: }
如有错误的地方希望大家批评指正,转载需注明出处,谢谢大家支持。