从 Unity 传递图像数据时,所有 ArUo 标签都被拒绝
All ArUo Tags are getting Rejected when passing the image data from Unity
背景
我正在尝试从从 Unity 发送到 OpenCV 函数的图像数据中检测 ArUco 标记,这些函数可使用其 .dll 进行访问。
版本
OpenCV:4.5.0/4.5.1
统一:2020.1.17f1
Aruco 词典:6x6_250 系列和 AprilTags 36h11 系列
问题
当我使用相机并发送每一帧时(如此处的代码所示),detectMarkers()
功能有效但每个标签都被拒绝。
我试过:
- 仅在 Unity 中使用
System.Array.Reverse(rawImg)
翻转图像 * 我也尝试过使用 flip(imageCopy, imageCopy, -1)
在 C++ 中翻转图像,然后在图像处理后返回;
- Unity 和 OpenCV 的组合。但是我通过'imshow()`确保输入
detectMarkers()
函数的图像是正确的(即没有翻转)。
- 我还从 aruCo 词典更改为 April 标签,这样标签中就不会出现版本不匹配的情况。
- 我还通过仅在 .dll 中使用
imread()
加载图像进行了检查。这有效并且标签被检测到。
- 另外,我也试过发送单个图像数据(使用Texture2D作为图像类型)。这里 Unity 在
cvtColor()
行期间崩溃。
部分Unity代码片段
private WebCamTexture CamTexture;
void Start()
{
CamTexture = new WebCamTexture();
CamTexture.Play();
}
void Update()
{
if (CamTexture.isPlaying)
{
var rawImg = CamTexture.GetPixels32();
MarkersDetection.detectAruco(ref ArucoID, ref arrayLength, ref rawImg, WebcamWidth, WebcamHeight);
}
}
部分OpenCV代码片段
struct Color32
{
uchar red;
uchar green;
uchar blue;
uchar alpha;
};
extern "C" void __declspec(dllexport) __stdcall detectAruco(int& outArucoID,int& arraySize,Color32 **rawImg,int width,int height) {
cv::Mat imageCopy;
cv::Mat image(height, width, CV_8UC4, *rawImg);
cvtColor(image, imageCopy, COLOR_BGRA2BGR);
cv::aruco::detectMarkers(imageCopy, arucoDictionary, arucoCorners, arucoIds, parameters, rejectedCandidates);
}
我做错了!现在我使用图像工具翻转图像(任何翻转图像的编辑工具都可以;而不是手动)现在它可以工作了。
背景
我正在尝试从从 Unity 发送到 OpenCV 函数的图像数据中检测 ArUco 标记,这些函数可使用其 .dll 进行访问。
版本
OpenCV:4.5.0/4.5.1
统一:2020.1.17f1
Aruco 词典:6x6_250 系列和 AprilTags 36h11 系列
问题
当我使用相机并发送每一帧时(如此处的代码所示),detectMarkers()
功能有效但每个标签都被拒绝。
我试过:
- 仅在 Unity 中使用
System.Array.Reverse(rawImg)
翻转图像 * 我也尝试过使用flip(imageCopy, imageCopy, -1)
在 C++ 中翻转图像,然后在图像处理后返回;
- Unity 和 OpenCV 的组合。但是我通过'imshow()`确保输入
detectMarkers()
函数的图像是正确的(即没有翻转)。
- 我还从 aruCo 词典更改为 April 标签,这样标签中就不会出现版本不匹配的情况。
- 我还通过仅在 .dll 中使用
imread()
加载图像进行了检查。这有效并且标签被检测到。 - 另外,我也试过发送单个图像数据(使用Texture2D作为图像类型)。这里 Unity 在
cvtColor()
行期间崩溃。
部分Unity代码片段
private WebCamTexture CamTexture;
void Start()
{
CamTexture = new WebCamTexture();
CamTexture.Play();
}
void Update()
{
if (CamTexture.isPlaying)
{
var rawImg = CamTexture.GetPixels32();
MarkersDetection.detectAruco(ref ArucoID, ref arrayLength, ref rawImg, WebcamWidth, WebcamHeight);
}
}
部分OpenCV代码片段
struct Color32
{
uchar red;
uchar green;
uchar blue;
uchar alpha;
};
extern "C" void __declspec(dllexport) __stdcall detectAruco(int& outArucoID,int& arraySize,Color32 **rawImg,int width,int height) {
cv::Mat imageCopy;
cv::Mat image(height, width, CV_8UC4, *rawImg);
cvtColor(image, imageCopy, COLOR_BGRA2BGR);
cv::aruco::detectMarkers(imageCopy, arucoDictionary, arucoCorners, arucoIds, parameters, rejectedCandidates);
}
我做错了!现在我使用图像工具翻转图像(任何翻转图像的编辑工具都可以;而不是手动)现在它可以工作了。