Unity调用C++ dll实现打开双目相机

目录
  • 1.vs中生成dll
  • 2.unity中justatry脚本
  • 3.在unity中调试
  • 4.在vs中调试
    • 4.1 把unity的工程生成对应的exe
    • 4.2 在vs项目的属性中做如下设置
    • 4.3 在VS工程的属性中的输出目录设置为上面的目录
  • 5.注意vs和unity的平台x86/x64要对应
    • 5.1 vs x86/x64
    • 5.2 unity

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工程里,应该就好了。

以上就是Unity调用C++ dll实现打开双目相机的详细内容,更多关于Unity双目相机的资料请关注我们其它相关文章!

(0)

相关推荐

  • Unity3D实现相机跟随控制

    本文实例为大家分享了Unity3D实现相机跟随控制的具体代码,供大家参考,具体内容如下 跟随算法 要实现3D摄像机的控制第一步就是先实现摄像机跟随物体移动. 要想让相机跟随物体移动,就要明白在一定角度下相机与物体的位置关系. 首先设置相机与物体之间的距离distance,相机与xz平面的角度为roll 所以根据三角关系可以求得映射在xz平面的距离d为distancecos(rool),相机高度为distancesin(roll). 如下图 现在就可以确定相机的高度了即y轴的坐标相机的y轴坐标应该

  • Unity实现相机截图功能

    最近做项目的时候需要在游戏里截一张高清截图,研究了一下写成脚本,方便以后使用. 脚本可以自定义分辨率,用相机截高清截图.可以用代码动态截图,也可以在编辑模式下截图. 注意截图宽高比要正确,宽高比不正确时可能会出问题. 截图效果: 脚本: CameraCapture.cs using UnityEngine; using System.IO; /// <summary> /// 相机截图 /// <para>ZhangYu 2018-07-06</para> /// &l

  • Unity相机移动之屏幕边缘检测

    本文实例为大家分享了Unity相机移动之屏幕边缘检测的具体代码,供大家参考,具体内容如下 功能: 类似LOL 红警 相机移动方式. 鼠标移动到屏幕边缘,相机随之移动. 当然还有可以加亿一点点细节,比如鼠标指针变化,滚轮推进拉远视野,中键平移视野等.(没做). 效果图: 这里做了可视化数据(可以看到限定的屏幕距离),线框内为检测的距离. 代码: 复制脚本,直接挂载相机上就可以用. using UnityEngine; /// <summary> /// 相机边缘移动 /// </summa

  • UnityRTS实现相机移动缩放功能

    所谓RTS就是即时战略游戏(Real-Time Strategy Game). 话不多说直接看一下demo: 相机的层级关系(移动的操作是对父物体进行操作,而缩放是对子物体主相机的操作): 以此场景为例,自己设置的一些参数,主要是移动速度,边界.缩放限制等. 代码如下(挂载到相机的父物体上).有两种鼠标的控制方式,一种是边界检测,一种是鼠标拖动.这个代码是完整版的,也就是键盘也可以控制相机移动缩放的,如果只需要鼠标控制的,请往下看: using UnityEngine; /// <summary

  • Unity实现场景漫游相机

    本文实例为大家分享了Unity实现场景漫游相机的具体代码,供大家参考,具体内容如下 前言 拿到场景后总喜欢在场景里面玩一段时间,那这个脚本就是你的不二选择 代码里加了注释,改起来也很方便. 使用方法 把脚本拖拽到场景相机上,开箱即用. WASD前后左右移动 QE为上下 Shift加速 鼠标右键按住旋转视角 ESC退出游戏 源码 #if ENABLE_INPUT_SYSTEM && ENABLE_INPUT_SYSTEM_PACKAGE #define USE_INPUT_SYSTEM us

  • Unity调用C++ dll实现打开双目相机

    目录 1.vs中生成dll 2.unity中justatry脚本 3.在unity中调试 4.在vs中调试 4.1 把unity的工程生成对应的exe 4.2 在vs项目的属性中做如下设置 4.3 在VS工程的属性中的输出目录设置为上面的目录 5.注意vs和unity的平台x86/x64要对应 5.1 vs x86/x64 5.2 unity 1.vs中生成dll 对应的生成dll的cpp如下 #include<opencv2/opencv.hpp> #include "opencv

  • IOS打开系统相机的闪光灯

    IOS有两种的拍照和视频的方式: 1.直接使用UIImagePickerController,这个类提供了一个简单便捷的拍照与选择图片库里图片的功能. 2.另一种是通过AVFoundation.framework框架完全自定义拍照的界面和选择图片库界面.我只做了第一种,就先给大家介绍第一种做法: 一.首先调用接口前,我们需要先判断当前设备是否支持UIImagePickerController,用isSourceTypeAvailable:来判断是否可用 二.查看符合的媒体类型,这个时候我们调用a

  • ASP.NET/C#中如何调用动态链接库DLL

    动态链接库(也称为DLL,即为"Dynamic Link Library"的缩写)是Microsoft Windows最重要的组成要素之一,打开Windows系统文件夹,你会发现文件夹中有很多DLL文件,Windows就是将一些主要的系统功能以DLL模块的形式实现. 动态链接库是不能直接执行的,也不能接收消息,它只是一个独立的文件,其中包含能被程序或其它DLL调用来完成一定操作的函数(方法.注:C#中一般称为"方法"),但这些函数不是执行程序本身的一部分,而是根据进

  • Java如何调用C++ DLL库

    最近做了一个网页端人脸识别的项目,用c++写了人脸识别的算法,但是在网页端要使用java后台,这其中就涉及到了java调用dll的问题.下面是小编通过查阅相关资料,实现的一个简单例子. 1.第一步,先在Java中新建一个类 如上图,其中注意这句System.loadLibrary("javaCallcpp");,这就是加载dll文件的代码了.然后我们需要dll中实现下面定义的加减乘除方法. 2.编译文件,文件名为Java2cpp.java,首先编译成class文件,如果用的是eclip

  • Unity调用手机摄像机识别二维码

    本文实现Unity调用手机摄像,拍摄,然后识别二维码,显示二维码的内容. 需要导入一个zxing.unity.dll文件,现在这个脚本的识别数据是放在Updata里边扫描的 数据量特别大会卡  要是用的话就自己做一下一秒执行一次.我这里没有弄 下载地址:zxing.unity.dll 代码: using System.Threading; using UnityEngine; using ZXing; public class WebCameraScript : MonoBehaviour {

  • Windows系统Python直接调用C++ DLL的方法

    环境:Window 10,VS 2019, Python 2.7.12, 64bit 1,打开 VS 2019,新建C++ Windows 动态链接库工程 Example,加入下列文件,如果Python是64位的则在VS中 Solution platforms 选择 x64 编译成64位的 DLL: Example.h #pragma once #ifndef CPP_EXPORTS #define CPP_EXPORTS #endif #ifdef CPP_EXPORTS #define CP

  • c++获取进程信息列表和进程所调用的dll列表

    复制代码 代码如下: // -----------------------// FileName: // ProcessInfo.h// remarks:// 基于应用层实现,有的进程,如杀软进程等获取不到调用的dll列表.// ----------------------- #pragma once#include <vector> struct ProInfo{    // 保存进程PID    unsigned int uPID;    // 保存进程名    CString strPr

  • C#调用C++DLL传递结构体数组的终极解决方案

    C#调用C++DLL传递结构体数组的终极解决方案 在项目开发时,要调用C++封装的DLL,普通的类型C#上一般都对应,只要用DllImport传入从DLL中引入函数就可以了.但是当传递的是结构体.结构体数组或者结构体指针的时候,就会发现C#上没有类型可以对应.这时怎么办,第一反应是C#也定义结构体,然后当成参数传弟.然而,当我们定义完一个结构体后想传递参数进去时,会抛异常,或者是传入了结构体,但是返回值却不是我们想要的,经过调试跟踪后发现,那些值压根没有改变过,代码如下. [DllImport(

  • C#编程调用Cards.dll实现图形化发牌功能示例

    本文实例讲述了C#编程调用Cards.dll实现图形化发牌功能.分享给大家供大家参考,具体如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices

  • Android打开系统相机并拍照的2种显示方法

    本文实例为大家分享了Android打开系统相机并拍照的具体实现代码,供大家参考,具体内容如下 目标效果: 第二张为点击第一个按钮拍照后显示的,比较模糊,第三章为点击第二个按钮拍照后显示的,比较清楚. 1.activity_main.xml页面设置布局. activity_main.xml页面: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="h

随机推荐