调用 aruco::detectMarkers crashes 时 Opencv 停止

Opencv stops when aruco::detectMarkers crashes is called

我正在尝试跟踪我的 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 个通道,即蓝色、红色、绿色和 alpha 通道;所以你的 Mat 持有 BGRA 图像。 正如您在错误中看到的那样,detectMarkers 需要 BGR(或 RGB)图像(3 个通道)或灰色图像(1 个通道)。

所以你应该在将图像传递给 detectMarker 之前转换它。例如,一种方法是:

 cvtColor(colorMat, colorMat, COLOR_BGRA2GRAY);

将您的图像转换为灰度图片。