opencv的C语言接口跟C++接口区别(入门篇)

opencv的C语言接口和C++接口区别(入门篇)

        opencv是一个开源的图像处理库,最经典的1.0版本提供的接口都是C语言接口。后来的opencv2.x版本保留了C语言接口,但是提供了C++接口,其中的C语言接口只是为了向后兼容,而C++接口才是大势所趋。那么这两者有什么区别呢?今天介绍一下配置过程中的区别。


        以opencv2.3.0和vs2008为例,配置时,先要配置包含文件和库文件,然后在系统变量path中添加dll文件,最后再项目属性中添加附加依赖库。我平时用的功能不多,一般添加这几项opencv_core230.lib,opencv_highgui230.lib,opencv_imgproc230.lib,opencv_video230.lib。需要说明的是,我使用的是C语言接口。什么是C语言接口,举个例子,读取视频文件的小程序。

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;

int main()
{
    CvCapture *pCapture=NULL;
    pCapture=cvCreateFileCapture("50254000.avi");
    IplImage *pFrame=NULL;
    cvNamedWindow("sor",0);
    while (pFrame = cvQueryFrame(pCapture))
    {
        cvShowImage("sor",pFrame);
	cvWaitKey(10);
    }
    return 0;
}
请原谅我没有释放pCapture和显示窗口,反正呢,这里用到的opencv函数,就是C语言接口。

今天突发奇想,想要用C++接口写个程序,结果碰到了问题。我还是照以前的方法进行配置。代码如下:

#include <opencv2/opencv.hpp>
#include <iostream>


using namespace std;
using namespace cv;

int main()
{
	VideoCapture capture("2014y12m17d08h21f58sYI.avi");
	if (!capture.isOpened())
	{
		cout << "fail to open the vedio" << endl;
		return 1;
	}
	Mat frame;
	namedWindow("test",0);  
	while (capture.read(frame))
	{
		imshow("test",frame);
		if (waitKey(10) == 27)
		{
			return 0;
		}
		
	}
	return 0;
}
同样是读取一段视频的程序,编译能通过,但是运行到第一句就出错。后来发现,是因为C语言接口和C++接口所用的库文件是不一样的。因此配置的时候,在项目属性的附加依赖性里应该换成这几项:opencv_core230d.lib,opencv_highgui230d.lib,opencv_imgproc230d.lib,opencv_video230d.lib,这样以后,运行正常。


当然,这只是两者在配置时候的一点小小的区别,现在opencv的C++接口提供了更多更先进的算法,并且向比C语言接口修改了一些bug,因此在使用opencv的过程中,应该多用C++接口。