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<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;
}

四、结果



  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值