Unity 调用dll打开相机、检测运动并在unity中作出反馈

本文介绍了如何使用Unity调用C++编写的DLL,结合OpenCV进行相机图像处理,实现运动检测功能。通过C#与C++的交互,将检测结果在Unity场景中实时反馈。
摘要由CSDN通过智能技术生成

C++ / OpenCV / .cpp /

#include<opencv2/opencv.hpp>
using namespace cv;

//..\..\UnityActivate\VSActivateUnity.exe

#define EXPORT_API __declspec(dllexport)

VideoCapture my_camera;
Mat image, imageR, imageL;
int m_width = 640;
int m_height = 480;

Mat background;
int count = 0;

int test = 0;

Mat MoveDetect(Mat background, Mat tex)
{
	//将background和img转为灰度图
	Mat result = tex.clone();
	Mat gray1, gray2;
	cvtColor(background, gray1, CV_BGR2GRAY);
	cvtColor(tex, gray2, CV_BGR2GRAY);

	//进行canny边缘检测 
	Canny(background, background, 0, 30, 3);

	//将background和img做差;对差值图diff进行阈值化处理
	Mat diff;
	absdiff(gray1, gray2, diff);
	//imshow("absdiss", diff);
	threshold(diff, diff, 50, 255, CV_THRESH_BINARY);
	//imshow("threshold", diff);

	//腐蚀膨胀消除噪音
	/*
	Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));
	Mat element2 = getStructuringElement(MORPH_RECT, Size(15, 15));
	erode(diff, diff, element);
	//imshow("erode", diff);
	dilate(diff, diff, element2);
	//imshow("dilate", diff);
	*/

	//二值化后使用中值滤波+膨胀
	Mat element = getStructuringElement(MORPH_RECT, Size(11, 11));
	medianBlur(diff, diff, 5);//中值滤波
	//imshow("medianBlur", diff);
	dilate(diff, diff, element);
	//blur(diff, diff, Size(10, 10)); //均值滤波
	//imshow("dilate", diff);

	//查找并绘制轮廓
	vector<vector<Point>> contours;
	vector<Vec4i> hierarcy;
	findContours(diff, contours, hierarcy, CV_RETR_EXTERNAL, CHAIN_APPROX_NONE); //查找轮廓
	vector<Rect> boundRect(contours.size()); //定义外接矩形集合
	//drawContours(img2, contours, -1, Scalar(0, 0, 255), 1, 8);  //绘制轮廓

	//查找正外接矩形
	int x0 = 0, y0 = 0, w0 = 0, h0 = 0;

	double Area = 0, AreaAll = 0;
	for (int i = 0; i<contours.size(); i++)
	{
		boundRect[i] = boundingRect((Mat)contours[i]); //查找每个轮廓的外接矩形
		x0 = boundRect[i].x;  //获得第i个外接矩形的左上角的x坐标
		y0 = boundRect[i].y; //获得第i个外接矩形的左上角的y坐标
		w0 = boundRect[i].width; //获得第i个外接矩形的宽度
		h0 = boundRect[i].height; //获得第i个外接矩形的高度

		//计算面积
		double Area = contourArea(contours[i]);//计算第i个轮廓的面积
		AreaAll = Area + AreaAll;

		//筛选
		if (w0>140 && h0>140)
			rectangle(result, Point(x0, y0), Point(x0 + w0, y0 + h0), Scalar(0, 255, 0), 2, 8); //绘制第i个外接矩形

		//文字输出
		Point org(10, 35);
		if (i >= 1 && AreaAll >= 19600)
		{
			putText(result, "Is Blocked ", org, CV_FONT_HERSHEY_SIMPLEX, 0.8f, Scalar(0, 255, 0), 2);
			test = 1;
		}

		else
			test = 0;
	}
	return result;
}


extern "C" bool  EXPORT_API openCamera()
{
	bool my_open = false;
	while (!my_camera.isOpened())
	{
		//std::co
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值