【发布时间】:2019-11-19 01:20:55
【问题描述】:
我想在 Unity3D 中识别 ArUco 标记并将游戏对象附加到它们的位置。我知道 Asset Store 中有软件包,但是当其他人使用它时,我正在寻找一个免费的现有解决方案或自己尝试。
ArucoUnity 检测效果很好,但 Unity 在访问rvecs、tvecs 的数据时崩溃。当调用c++方法au_cv_Vec3d_get(CppPtr, i, CppPtr);时,Vec3d类中的Get(int i)某处出现错误
OpenCv plus Unity 这个实现似乎不完整,因为不存在EstimatePoseSingleMarker 或类似的函数来获取rvecs 和tvecs。最后一次更新是 2019 年 1 月。
由于 Unity (C#) 提供了访问非托管代码的可能性,我遵循了 this 很棒的教程,并且请求我能够将 cv::VideoCaputre 流转发到 Unity。发生的唯一问题是 FPS 下降到 35-40 左右,而通常我得到 90-100 左右。
C# 代码:
void Update()
{
MatToTexture2D();
image.texture = tex;
}
void MatToTexture2D()
{
OpenCVInterop.GetRawImageBytes(pixelPtr);
//Update the Texture2D with array updated in C++
tex.SetPixels32(pixel32);
tex.Apply();
}
C++ 代码:
extern "C" void __declspec(dllexport) __stdcall GetRawImageBytes(unsigned char* data)
{
_capture >> _currentFrame;
cv::Mat resizedMat(camHeight, camWidth, _currentFrame.type());
cv::resize(_currentFrame, resizedMat, resizedMat.size(), cv::INTER_CUBIC);
//Convert from RGB to ARGB
cv::Mat argb_img;
cv::cvtColor(resizedMat, argb_img, cv::COLOR_BGR2BGRA);
std::vector<cv::Mat> bgra;
cv::split(argb_img, bgra);
std::swap(bgra[0], bgra[3]);
std::swap(bgra[1], bgra[2]);
std::memcpy(data, argb_img.data, argb_img.total() * argb_img.elemSize());
}
原因似乎是第一行_capture >> _currentFrame;,但由于其他项目必须这样做(至少我猜是这样),我想知道是否还有其他原因。
如果我无法解决此问题,我必须寻找替代方法。
【问题讨论】:
标签: c# c++ opencv unity3d interop