我试图跟踪我的aruco标记,但是当我调用detectMarkers()函数时,我的应用程序停止了,我完全不知道为什么。
所以我这样使用它:

aruco::detectMarkers(colorMat, markerDictionnary, markerCorners, markerIds);
变量声明如下:
vector<vector<Point2f>> markerCorners;
Ptr<aruco::Dictionary> markerDictionnary = aruco::getPredefinedDictionary(aruco::PREDEFINED_DICTIONARY_NAME::DICT_4X4_50);
vector<int> markerIds;
我的colorMat在先前的函数中进行了声明和填充,因此我将复制使用它的每一行:
cv::Mat colorMat;
colorMat = Mat(colorHeight, colorWidth, CV_8UC4, &colorBuffer[0]).clone();
cv::flip(colorMat, colorMat, 1);
cv::imshow("Color", colorMat);
我在控制台中收到的错误是:
OpenCV(4.3.0) Error: Assertion failed (_in.type() == CV_8UC1 || _in.type() == CV_8UC3) in cv::aruco::_convertToGrey, file C:\Users\...\Librairies\opencv_contrib-4.3.0\modules\aruco\src\aruco.cpp, line 107
OpenCV(4.3.0) C:\Users\...\Librairies\opencv_contrib-4.3.0\modules\aruco\src\aruco.cpp:107: error: (-215:Assertion failed) _in.type() == CV_8UC1 || _in.type() == CV_8UC3 in function 'cv::aruco::_convertToGrey'
有人知道此错误来自何处吗?预先感谢!

最佳答案

如您所见:

colorMat = Mat(colorHeight, colorWidth, CV_8UC4, &colorBuffer[0]).clone();
您正在创建一个cv::Mat,它具有4个通道,分别是Blue,Red,Green和alpha通道;因此您的Mat持有BGRA图片。
就像您在错误中看到的那样,detectMarkers需要BGR(或RGB)图像(3通道)或灰度图像(1通道)。
因此,您应该在将图像传递给detectMarker之前对其进行转换。一种方法是,例如:
 cvtColor(colorMat, colorMat, COLOR_BGRA2GRAY);
将您的图像转换为灰度图片。

09-05 20:45