一、知识要点:
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<opencv.hpp>
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<opencv.hpp>
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 <stdio.h>
#include <stdlib.h>
#include<cv.h>
#include<highgui.h>
#include<cxcore.h>
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;
}