c调用c++:opencv c版本打开相机方法

一、知识要点:
        c调用c++函数
二、背景:
    以前工程使用的是c语言开发且工程比较大,而现在的工程使用的是C++编写的。前者较大,后者较小。虽然说C++能很好的兼容c语言,但是在工程庞大的情况下,将C全部改写成C++也是相当麻烦的,会出现很多很多的无法解析的外部符号。所以最恰当的方法是写一个接口,使得C能调用C++。
    例如,很多含有大量算法的工程是使用c编写的,而目前opencv主要是使用C++,opencv中也有含有c版本的函数,但是可能是由于目前windows操作系统相机驱动不支持的原因(未深究),一般情况下无法打开相机。必须使用c++才能打开相机。所以面临语言兼容的问题。
      下面是一个c语言调用c++打开相机的小例子,其中:
      (1)、Camera.cpp为在c++下对相机和图像进行的操作;
     (2)、 libcamera.cpp为c与c++转换的中间层;
      (3)、main.c为在c下调用打开相机。

三、代码如下:
(1)、Camera.cpp为在c++下对相机和图像进行的操作;
//camera.cpp
#include

using namespace cv;

VideoCapture cap;
Mat frame;

//打开相机
int OpenCamera(int index)
{
	cap.open(index);

	if (cap.isOpened())
	{
		return true;
	}
	else
	{
		return false;
	}
}

//读取图片
IplImage ReadFrame()
{
	IplImage img;

	cap >> frame;

	//img(frame);
	
	img = IplImage(frame);

	return img;
}
(2)、 libcamera.cpp为c与c++转换的中间层;
#include

using namespace cv;

//  libcamera.cpp
int add(const int a, const int b);

int OpenCamera(int index);

IplImage ReadFrame();

#ifdef __cplusplus
extern "C"
{
#endif

	int call_cpp_add(const int a, const int b)
	{
		return add(a, b);
	}

	int call_cpp_OpenCamera(int index)
	{
		return OpenCamera(index);
	}

	IplImage call_cpp_ReadFrame()
	{
		return ReadFrame();
	}
    

#ifdef __cplusplus
}
#endif
(3)、 main.c为在c下调用打开相机。
//  main.c
#include 
#include 
#include
#include
#include


int call_cpp_add(const int a, const int b);

int call_cpp_OpenCamera(int index);

IplImage call_cpp_ReadFrame();


int main()
{
	//printf("%d\n", call_cpp_add(2, 4));
	IplImage frame;

	//打开相机
	if (!call_cpp_OpenCamera(0))
	{
		printf("Camera open failed!\n");
		printf("end------!\n");

	}
	else
	{
		printf("Camera open success!\n");

		while (1)
		{
			frame = call_cpp_ReadFrame();

			cvShowImage("Img", &frame);

			cvWaitKey(20);

		}
	}


	

	getchar();
	return 0;
}

四、结果

c调用c++:opencv c版本打开相机方法_第1张图片

你可能感兴趣的:(接口技术)