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
0
投稿
猜你喜欢
- 您已经看到很多包含视频内容的应用程序,比如带有视频教程的食谱应用程序、电影应用程序和体育相关的应用程序。您是否想知道如何将视频内容添加到您的
- java jdbc连接和使用jdbc导入驱动//jar是已经打包好的class文件集,可以引用到其他工程中 //Build Pa
- 本文实例为大家分享了Java判断对象是否为空的具体代码,供大家参考,具体内容如下package com.gj5u.publics.util;
- 话不多说,请看代码:package com.lxj.demo;import java.io.BufferedReader;import ja
- Android Build类的详解及简单实例一、类结构:java.lang.Object? android.os.Build二、类概述:从系
- foreach查询不出结果也不报错问题首先,执行的时候语法没有报错,其次sql语句拿到数据库去执行能查到数据,但是在接口这边返回空输数据,查
- 首先创建一个用户控件 如下图 用到的控件 label、button、TextBox 内部代码如下#region 分页字段和属性pr
- import java.util.regex.Matcher;import java.util.regex.Pattern; /*
- 1、认识XML解析技术1.1、XML相关概念(1)DTD:XML语法规则,是XML文件的验证机制,可以通过比较XML文档和DTD文件看文档是
- 首先引入pom <!--SpringBoot 2.1.0--> <parent>  
- 一、概要我们可以用java实现简单的登录界面。如上效果,直观但也需要一步一步来完成,从界面弹窗的设置,图片的插入,文本框的设置,到登录的按钮
- 为什么要前后端分离?以Java Web项目为例,在传统的开发模式中,前端代码(Html、js、css)写在JSP中,甚至JSP中嵌入Java
- Java 开发中,需要将一些易变的配置参数放置再 XML 配置文件或者 properties 配置文件中。然而 XML 配置文件需要通过 D
- 背景:新需求需要引入新jar包,引入后发现本地启动没有报错,发到测试环境提示某个bean无法创建,nested exception is j
- 前言Groovy 是一种基于 JVM 的动态语言,与 Java 语言紧密集成,可以很方便地在 Java 项目中使用。Groovy 有着简洁的
- 故事背景故事发生在几个星期前,自动化平台代码开放给整个测试团队以后,越来越多的同事开始探索平台代码。为了保障自动化测试相关的数据和沉淀能不被
- eclipse导入Spring配置文件约束 Windows-Preference-XML-XMLCatalog点 Add 选Fil
- 前段时间学习JDBC,要连接mysql获取数据。按照老师的样例数据,要存一些名字之类的信息,用的都是英文名,我当时就不太想用英文,就把我室友
- 请求进入DispatcherServlet的doDispatch后,获取HandlerMethod。然后根据HandlerMethod来确认
- 做快递面单打印模板,快递要求纸张大小100 x 150mm。PageSize.A4=595 x 842A4尺寸=210mm×297mm故设置