我想在Unity3D中识别ArUco标记并将GameObject附加到它们的位置。我知道Asset Store中有一些软件包,但是随着其他人开始使用它,我正在寻找免费的现有解决方案或自己尝试。
ArucoUnity的检测工作像一个超级按钮,但是访问rvecs
,tvecs
的数据时Unity崩溃。当调用c ++方法Get(int i)
时,在Vec3d
类的au_cv_Vec3d_get(CppPtr,i,CppPtr);
中的某处发生了错误
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;
,但是由于其他项目也必须这样做(至少我猜是这样),所以我想知道是否还有其他原因。
如果我无法解决此问题,则必须寻找替代方法。