Unity调用C++ dll实现打开双目相机
作者:天人合一peng 发布时间:2022-05-28 13:19:51
标签:Unity,C++,dll,双目相机
1.vs中生成dll
对应的生成dll的cpp如下
#include<opencv2/opencv.hpp>
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;
#define EXPORT_API __declspec(dllexport)
VideoCapture my_camera;
int width = 640;
int height = 480;
extern "C" bool EXPORT_API openCamera()
{
bool my_open = false;
while (!my_camera.isOpened())
{
std::cout << "Cannot open the camera!" << std::endl;
my_camera.open(0);//一个接口能同时打开两个摄像头
}
my_camera.set(CV_CAP_PROP_FRAME_WIDTH, width*2);
my_camera.set(CV_CAP_PROP_FRAME_HEIGHT, height);
if (my_camera.isOpened())
{
my_open = true;
}
return my_open;
}
extern "C" void EXPORT_API recieveFrame(uchar* texturePtr)
{
Mat my_frameBGR;
Mat my_frameRBG;
my_camera >> my_frameBGR;
if (my_frameBGR.data)
{
cvtColor(my_frameBGR, my_frameRBG, CV_BGR2RGB);
memcpy(texturePtr, my_frameRBG.data, my_frameRBG.cols*my_frameRBG.rows*my_frameRBG.channels()*sizeof(uchar));
}
}
extern "C" void EXPORT_API closeCamera()
{
if (my_camera.isOpened())
{
my_camera.release();
}
}
2.unity中justatry脚本
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
using System.Runtime.InteropServices;用 c++中 dll 文件需要引入
public class justatry : MonoBehaviour {
[DllImport("_dectecting")]
public static extern bool openCamera();
[DllImport("_dectecting")]
public static extern bool recieveFrame(byte[] imageData);
[DllImport("_dectecting")]
public static extern bool closeCamera();
public bool IsOpen = false;
public byte[] imageData;
public Texture2D tex;
public int Width = 640;
public int Length = 480;
// Use this for initialization
void Start () {
IsOpen = openCamera();
if(IsOpen)
{
imageData = new byte[Length * Width * 3*2];
tex = new Texture2D(Width*2, Length, TextureFormat.RGB24, false);
}
}
// Update is called once per frame
void Update () {
if (IsOpen)
{
recieveFrame(imageData);
tex.LoadRawTextureData(imageData);
tex.Apply();
GetComponent<Renderer>().material.mainTexture = tex;
}
}
void CloseCamera()
{
if (IsOpen)
{
closeCamera();
}
}
public void OnApplicatoinQuit()
{
closeCamera();
}
}
using System.Runtime.InteropServices;用 c++中 dll 文件需要引入
public class justatry : MonoBehaviour {
[DllImport("_dectecting")]
public static extern bool openCamera();
[DllImport("_dectecting")]
public static extern bool recieveFrame(byte[] imageData);
[DllImport("_dectecting")]
public static extern bool closeCamera();
public bool IsOpen = false;
public byte[] imageData;
public Texture2D tex;
public int Width = 640;
public int Length = 480;
// Use this for initialization
void Start () {
IsOpen = openCamera();
if(IsOpen)
{
imageData = new byte[Length * Width * 3*2];
tex = new Texture2D(Width*2, Length, TextureFormat.RGB24, false);
}
}
// Update is called once per frame
void Update () {
if (IsOpen)
{
recieveFrame(imageData);
tex.LoadRawTextureData(imageData);
tex.Apply();
GetComponent<Renderer>().material.mainTexture = tex;
}
}
void CloseCamera()
{
if (IsOpen)
{
closeCamera();
}
}
public void OnApplicatoinQuit()
{
closeCamera();
}
}
注意,脚本要挂在plane上
3.在unity中调试
dll的输出目录是 unity项目工程名\Assets\Plugins
D:\Michael Wang\SC\2018\1\openDoublecamera\UnityTry\Assets\Plugins
4.在vs中调试
4.1 把unity的工程生成对应的exe
这是生成的unity exe对应的生成目录
对应的目录如
D:\Michael Wang\SC\2018\1\openDoublecamera\UnityTry\test.exe
4.2 在vs项目的属性中做如下设置
命令后用上面的路径,注意是放在命令里不是命令参数里
在对应的unity exe目录中找到 unity工程名_Data下Plugins的目录是
D:\Michael Wang\SC\2018\1\openDoublecamera\UnityTry\test_Data\Plugins
4.3 在VS工程的属性中的输出目录设置为上面的目录
做完以上设置就直接可以在VS下调试了。
5.注意vs和unity的平台x86/x64要对应
5.1 vs x86/x64
5.2 unity
如果按以上设置还是不对,提示找不到dll,则把dll的输出放在与Plugins或Assets文件夹同一级尝试。
如果你已经把dll放在这里了,还是显示找不到,则一定是你用vs生成dll的库没有在环境变量里,然后unity里面调用时找不到vs生成dll所依赖的一些库。可以把一些你知道的库直接放在vs生成的dll一起,全放在unity工程里,应该就好了。
来源:https://blog.csdn.net/moonlightpeng/article/details/79017204


猜你喜欢
- 本文实例为大家分享了ftp实现文件上传下载的具体代码,供大家参考,具体内容如下package getUrlPic;import java.i
- 思路要求ScrollView 嵌套 地址栏 和 WebView手指滑屏向下滚动(网页向上),如果网页有滚动条,首先把 地址栏 滚动到消失,然
- 因为一直用spring整合了mybatis,所以很少用到mybatis的session缓存。 习惯是本地缓存自己用map写或者引入第三方的本
- 效果:说明:输入小数,然后输入要保留的位数,事件:点击Button代码:public static double Round(double
- android去掉滑动到顶部和底部的阴影<ListViewandroid:id="@+id/listView"an
- 本文实例为大家分享了Java实现图片拼接的具体代码,供大家参考,具体内容如下/** * 拼接图片(注:图片需长宽一致) * @param f
- 引言♀ 小AD:明哥,昨天气死我了,明哥要帮我出气。♂ 明世隐:咋了,有谁惹到你了。♀ 小AD:昨天辅助喷我小鲁班菜,我反手就对喷,然后竟然
- 前言关于链表这一块,写了多篇博客,学习了顺序表、单链表、及其一些练习题顺序表:传送门:顺序表单链表:传送门:单链表1
- 该篇文章是说明在Android手机或平板电脑中如何实现截取当前屏幕的功能,并把截取的屏幕保存到SDCard中的某个目录文件夹下面。实现的代码
- 本文实例为大家分享了使用OkHttp发送post请求的具体代码,供大家参考,具体内容如下MainActivity.javapublic cl
- MAC设置JDK环境变量1、sudo vim ~/.bash_profile2、设置内容 (写自己的JDK路径,有两种方式查看)JAVA_H
- 一、结构型模式结构型模式有什么好处?从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题二、适配器模式USB网线转换器三、
- 原则:1、垃圾回收机制,维护引用信息不维护指针信息2、引用类型的实例化对象在生存期内由垃圾回收机制处理,可能移动内存3、当一个类的实例化对象
- MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoD
- 最近 IDEA 2020最后一个版本发布了 ,已经内置了Lombok插件,SpringBoot 2.1.x之后的版本也在Starter中内置
- 常量池中各数据项类型详解常量池中的数据项是通过索引来引用的, 常量池中的各个数据项之间也会相互引用。在这11中常量池数据项类型中, 有两种比
- 一、概述有序数组中常常用到二分查找,能提高查找的速度。今天,我们用顺序查找和二分查找实现数组的增删改查。二、有序数组的优缺点优点:查找速度比
- 一、什么是单例模式?单例设计模式(Singleton Design Pattern)理解起来非常简单。一个类只允许创建一个对象(或者实例),
- 最近,在使用spring cloud框架时,发现feign也能实现三方请求,而且实现很简单,请求接口的结构很清晰,便果断学习一波。记录一下。
- 一. 编写.cs文件注:要想编译dll中注释可用,则代码中的注释要用“ /// ” 来进行注释,否则