在Unity中使用OpenCV DLL

Create an OpenCV DLL with VS2019 for Unity 2019

使用VS 2019创建一个使用OpenCV 的插件,以在Unity 2019中使用。

1. VS 2019 创建 DLL

创建 C++ 工程

打开 VS 2019,依次选择 Create a new project,Windows Desktop Wizard,点击 Next 按钮。设定Project Name为OpenCVDll,如下所示。点击 Create 按钮。
在这里插入图片描述
在弹出的对话框中选择 Dynamic Link Library (.dll),如下所示。
在这里插入图片描述
修改 Solution Configuration 为 Release,Solution Platforms为 x64。

C++ 实现代码

头文件为OpenCVDll.h,代码如下所示:

#pragma once

#include <stdexcept>
#include <windows.h>
#include <iostream>

#ifdef USINGOPENCV_EXPORTS  
#define USINGOPENCV_EXPORTS_API __declspec(dllexport)   
#else  
#define USINGOPENCV_EXPORTS_API __declspec(dllimport)   
#endif  


namespace UsingOpenCV
{
	class Functions
	{
	public:
		// Initialize OpenCV.
		static USINGOPENCV_EXPORTS_API void Initialize();

		// return each frame.
		static USINGOPENCV_EXPORTS_API BYTE* ProcessFrame();
	};
}

源文件为 OpenCVDll.cpp,如下所示:

#include "framework.h"
#include "OpenCVDLL.h"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>

using namespace cv;
using namespace std;

namespace UsingOpenCV
{
	cv::VideoCapture* cap;

	void Functions::Initialize()
	{
		cap = new cv::VideoCapture(0);
	}

	BYTE* Functions::ProcessFrame() {
		cv::Mat image;
		cv::Mat betterImage;

		BYTE* result;

		(*cap) >> image;

		cv::flip(image, image, 0);

		cv::cvtColor(image, betterImage, CV_BGR2BGRA, 4);

		result = new BYTE[image.cols * image.rows * 4];

		memcpy(result, betterImage.data, betterImage.cols * image.rows * 4);
		return result;
	}
}

OpenCV 文件夹引用设置

右键点击工程名称,选择 Properties,弹出对话框。
在C/C++,General → Additional Include Directories,添加 OpenCV 的 include文件夹,如下所示:
在这里插入图片描述
在Linker,General → Additional Library Directories,添加 OpenCV 的 libraries 文件夹,如下所示:
在这里插入图片描述
在Linker,Input → Additional Dependencies,添加 opencv_world347.lib 文件(依下载的OpenCV版本而定) ,如下所示:
在这里插入图片描述
右键点击工程名称,选择 Build,即可生成 OpenCVDll.dll 文件。

2. 在Unity中使用 DLL

创建 Unity 工程

create unity project
新建一个Plugins文件夹,并在该文件夹内创建一个x64文件夹,将上面生成的 OpenCVDll.dll 以及 opencv_world347.dll文件拖入该文件夹。

创建使用 dll 的脚本

文件名为,代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.InteropServices;

public class UsingDLL : MonoBehaviour
{
    //Lets make our calls from the Plugin
    [DllImport("OpenCVDll", EntryPoint ="?Initialize@Functions@BackgroundSubtraction@@SAXXZ")]
    private static extern void Initialize();

    [DllImport("OpenCVDll", EntryPoint = "?ProcessFrame@Functions@BackgroundSubtraction@@SAPEAEXZ")]
    private static extern byte[] ProcessFrame();
    Material m;
    void Start()
    {
        Initialize();
        Debug.Log("done");
        m = new Material(Shader.Find("Diffuse"));
    }

    void Update()
    {
        byte[] imgData = ProcessFrame();
        Texture2D tex = new Texture2D(640, 480, TextureFormat.BGRA32, false);
        tex.LoadRawTextureData(imgData);
        tex.Apply();
        m.mainTexture = tex;
        this.GetComponent<Renderer>().material = m;
    }
}

其中 dll 引用时的 EntryPoint 是通过 Dependency Walker (http://www.dependencywalker.com/)得到的,如下所示:
在这里插入图片描述

创建物体

在场景中任意创建一个带有材质文件的物体,如Quad,并将UsingDLL.cs 脚本拖放到这个物体上,如下所示:
在这里插入图片描述
点击运行,即可在Quad物体上看到摄像头拍摄的视频。

参考资料

  1. Creating an OpenCV DLL with Visual Studio 2017 for Unity 2017
使用Unity结合OpenCV进行图片人脸识别合成是一种常见的应用场景。首先,我们需要导入OpenCV库到Unity项目。可以使用Unity的插件系统或者第三方的OpenCVUnity插件来实现。 接下来,根据项目需求,我们可以使用Unity的游戏对象来创建一个平面,作为展示图片人脸识别合成的背景。然后,利用Unity的渲染纹理功能,将OpenCV处理过的图像合成到该平面上。 图片人脸识别通常需要使用OpenCV提供的人脸检测功能。在Unity,可以使用OpenCVUnity插件提供的接口来调用OpenCV的人脸检测算法,获取到检测到的人脸位置信息。 接着,我们可以利用Unity的纹理功能将需要合成的人脸图像加载到游戏对象上,并根据得到的人脸位置信息进行缩放、旋转和偏移等操作,使得合成的人脸图像能够与背景平面的人脸位置对齐。 最后,通过Unity的摄像机设置,可以调整摄像机的视角和位置,以便实现更好的展示效果。我们可以添加一些特效,如光照效果、模糊等,使得合成的结果看起来更加真实。 总结起来,通过Unity结合OpenCV,我们可以实现图片人脸识别合成的效果。在Unity,我们可以利用OpenCV提供的人脸检测功能,结合Unity的渲染纹理和摄像机设置,使得合成的效果更加逼真。使用Unity的开发环境,可以方便地进行设计和调试,并且还可以添加各种特效来增加合成图像的艺术效果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值