基于本机openCV的统一申请
Android application on unity based on native OpenCV
我很疑问,我希望您可以解决它。
我想以Unity创建一个Android应用程序。该应用程序包括激活设备的相机并在屏幕上查看。为此,我想基于基于OpenCV的本机C 代码。
我有生成的代码,但是当我运行应用程序时,我会看到场景,但没有看到图像,并且我有感觉是因为OpenCV的视频关注功能我对Android的使用不佳。你能帮我我附加代码:
c :
__declspec(dllexport) void iniciar(int& widt, int& heigh) {
camera.open(0);
if (!camera.isOpened())
{
return;
}
widt = (int)camera.get(CV_CAP_PROP_FRAME_WIDTH);
heigh = (int)camera.get(CV_CAP_PROP_FRAME_HEIGHT);
trueRect.x = 5;
trueRect.y = 5;
trueRect.width = 100;
trueRect.height = 100;
midX = 1;
midY = 1;
wi = 0;
he = 0;
}
__declspec(dllexport)
void video(unsigned char* arr) {
Mat frame;
Mat resi;
Mat dst;//dst image
camera >> frame;
if (frame.empty()) {
return;
}
flip(frame, dst,1);
//resize(dst, resi, Size(width, height));
cv::cvtColor(dst, dst, COLOR_BGR2RGB);
copy(dst.datastart, dst.dataend, arr);
}
c#:
public class camara : MonoBehaviour {
[DllImport("NativoPrincipio")]
public static extern void video(byte[] img);
[DllImport("NativoPrincipio")]
public static extern void iniciar(ref int widt, ref int heigh);
WebCamTexture back;
Texture2D textura;
byte[] imgData;
int width = 0;
int height = 0;
// Use this for initialization
void Start () {
back = new WebCamTexture();
//GetComponent<Renderer>().material.mainTexture = back;
//back.Play();
iniciar(ref width, ref height);
}
// Update is called once per frame
void Update ()
{
imgData = new byte[width * height * 4];
video(imgData);
textura = new Texture2D(width, height, TextureFormat.RGB24, false);
textura.LoadRawTextureData(imgData);
textura.Apply();
GetComponent<Renderer>().material.mainTexture = textura;
imgData = null;
textura = null;
}}
如果您在github上托管了整个代码,或者可以创建要点会更好。
,但是,我认为您的相机框架是空的。
我将尝试枚举为什么会发生这种情况。
-
首先,openCV视频捕获类 camera.open(0)没有FFMPEG(对于Android Native来说都不容易交叉跨秒)。
- 如果您想在Android中使用C 中的本机摄像机,则需要使用API 24的最新NDK。
-
我看到您正在使用Unity的WebCamtexture类,但是几乎可能是抓取的纹理是空的,因此您在图像中看到了黑屏。
您是否尝试搜索openCV的Unity插件?我唯一看到的是(不是免费的): https://www.assetstore.unity3d.com/en/#!/content/21088
如果这不起作用,您是否可以将Java代码粘贴到Unity Projects?因为在Java中捕获相机要容易得多。希望这些线索对您有所帮助。
Ondo Izan Eta Animo。
unai。
盯着您的代码几分钟后,我发现了您的代码中的几个错误。
1 。您在C 方面使用了COLOR_BGR2RGB
。这应该是COLOR_BGR2BGRA
,因为您在C#方面使用TextureFormat.RGB24
。
2 。如果要修改C 插件内的C#数组,则必须将其固定在内存中。修改后,您可以取消它。如果您不这样做,您将遇到一个错误的错误。
使用fixed
关键字固定数组,然后将其施加到IntPtr
,然后将其传递给视频功能,为IntPtr
。也要传递数组大小总是一个好主意,这样您就不会使用不存在的索引。
类似的东西:
[DllImport("NativoPrincipio")]
public static extern void video(IntPtr img, int count);
...
//Pin Memory
fixed (byte* p = imgData)
{
video((IntPtr)p, imgData.Length);
}
3 。本文是可选的,但是您可能需要使用Java读取相机中的图像,然后使用C 传递图像。我看到许多人通过使用OpenCV从相机中读取问题而遇到问题,更不用说它也很慢了。
- 从C++本机插件更新Vector3数组
- GCC本机矩阵运算库
- 从 Android 中的原生 c++ 文件调用本机 opencv
- 基于本机openCV的统一申请
- 无法使用cv :: imwrite保存垫子图像在JNI本机代码OPENCV中
- android.mk-包括与NDK辅助的本机C 的OPENCV目录
- 本机C++等效于 C# 中的 ManualResetEvent
- 整齐地打包依赖于大量本机 DLL 的 C++/CLI DLL
- 如何在 Eclipse 中调试 Android 上的 OpenCV 示例的本机代码
- Android NDK OpenCV - 找不到本机的实现
- 通过JNI执行OpenCV本机函数的问题
- C++/CLI(.NET)等效于将结构写入网络的本机C++
- 未能构建opencv jni示例-opencv示例-本机活动(未定义引用)
- 使用OpenCV 3.1在Android Studio 1.5中开发本机C++应用程序
- 有没有一种方法可以让本机npm包依赖于特定版本的v8C++API
- 未找到Android中的本机OpenCV UnsatisfiedLinkError libopencv_java.so
- 在Android应用程序开发的本机代码中使用opencv
- Mingw依赖于非windows本机DLL
- 在 AIR 本机扩展中包含库会导致错误,"The extension context does not have a method with the name..."适用于所有方法
- openCV java代码传递点对象到本机代码(c++)