【问题标题】:OpenCV Aruco Markers are not recognized on industrial cameras工业相机无法识别 OpenCV Aruco Markers
【发布时间】:2025-12-18 12:30:01
【问题描述】:

我正在检测工业自动化技术 C2 相机上的 ARUCO 标记,该相机旨在检测三角测量扫描仪中的激光条纹,但它们也可以捕获图像。 我的问题是,无论我使用什么相机,除了我之前提到的相机,都会检测到相同的标记。 我的代码的最小工作示例如下:

#include <opencv2/highgui.hpp>
#include <opencv2/aruco/charuco.hpp>

using namespace std;
using namespace cv;

int main(int argc, char *argv[]) {

int squaresX = 10;
int squaresY = 7;
float squareLength = 28;
float markerLength = 19;
int dictionaryId = 6;
bool showRejected = true;
bool refindStrategy = true;

Ptr<aruco::DetectorParameters> detectorParams = aruco::DetectorParameters::create();

Ptr<aruco::Dictionary> dictionary =
    aruco::getPredefinedDictionary(aruco::PREDEFINED_DICTIONARY_NAME(dictionaryId));

// create charuco board object
Ptr<aruco::CharucoBoard> charucoboard =
    aruco::CharucoBoard::create(squaresX, squaresY, squareLength, markerLength, dictionary);
Ptr<aruco::Board> board = charucoboard.staticCast<aruco::Board>();

Mat image = imread("C:\\Users\\Piotrek\\Desktop\\calib\\022.jpg"), imageCopy;

vector< int > markerIds, charucoIds;
vector< vector< Point2f > > markerCorners, rejectedMarkers;
vector< Point2f > charucoCorners;

// detect markers
aruco::detectMarkers(image, dictionary, markerCorners, markerIds, detectorParams,
    rejectedMarkers);

image.copyTo(imageCopy);
if (markerIds.size() > 0) {
    aruco::drawDetectedMarkers(imageCopy, markerCorners);
}

if (showRejected && rejectedMarkers.size() > 0)
    aruco::drawDetectedMarkers(imageCopy, rejectedMarkers, noArray(), Scalar(100, 0, 255));

//display results
imshow("out", imageCopy);
waitKey(0);

return 0;
}

Sample image from camera:

问题是标记被检测到但由于未知原因被拒绝:

Rejected markers

我使用 OpenCV 3.1。

【问题讨论】:

    标签: c++ opencv aruco


    【解决方案1】:

    问题解决了。我必须翻转图像,现在可以完美地检测到标记。

    【讨论】:

      【解决方案2】:

      是的,在x方向翻转图像即可解决。

      opencv cv::flip(image, flippedImage, 1)
      

      【讨论】:

      • 你能解释一下为什么需要翻转吗?似乎这也解决了我的问题,但我不知道为什么需要翻转。
      • 事实证明,在我的情况下,我正在创建 aruco 标记的位掩码,但是在从 Mat 中获取位时会混淆 x/y 与 y/x。我有'markerBitMap.Get(x, y)',它应该是markerBitMap.Get(y, x)。