使用ArUco标记时坐标轴计算异常问题求助
OpenCV ArUco标记方向识别异常:Z轴始终指向左上角
问题描述
我在研究用OpenCV识别褶皱位置的示例,标记线显示正常,但方向识别存在问题——Z轴始终指向左上角。
原始代码
float markerLength = 0.2; // Set coordinate system cv::Mat objPoints(4, 1, CV_32FC3); objPoints.ptr<cv::Vec3f>(0)[0] = cv::Vec3f(-markerLength/2.f, markerLength/2.f, 0); objPoints.ptr<cv::Vec3f>(0)[1] = cv::Vec3f( markerLength/2.f, markerLength/2.f, 0); objPoints.ptr<cv::Vec3f>(0)[2] = cv::Vec3f( markerLength/2.f, -markerLength/2.f, 0); objPoints.ptr<cv::Vec3f>(0)[3] = cv::Vec3f(-markerLength/2.f, -markerLength/2.f, 0); cv::Mat cameraMatrix(3,3,cv::DataType<double>::type); cv::setIdentity(cameraMatrix); cv::Mat distCoeffs(4,1,cv::DataType<double>::type); distCoeffs.at<double>(0) = 0; distCoeffs.at<double>(1) = 0; distCoeffs.at<double>(2) = 0; distCoeffs.at<double>(3) = 0; std::vector<cv::Vec3d> rvecs, tvecs; while (m_videoCap.isOpened()) { m_videoCap >> m_frame; if (!m_frame.empty()) { // Draw marker centers cv::Mat outputImage = m_frame.clone(); std::vector<int> markerIds; std::vector<std::vector<cv::Point2f>> markerCorners, rejectedCandidates; cv::Ptr<cv::aruco::DetectorParameters> parameters = cv::aruco::DetectorParameters::create(); cv::Ptr<cv::aruco::Dictionary> dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_4X4_250); cv::aruco::detectMarkers(m_frame, dictionary, markerCorners, markerIds, parameters, rejectedCandidates); cv::aruco::drawDetectedMarkers(outputImage, markerCorners); int nMarkers = markerCorners.size(); std::vector<cv::Vec3d> rvecs(nMarkers), tvecs(nMarkers); for (int i = 0; i < nMarkers; i++) { auto& corners = markerCorners[i]; cv::solvePnP(objPoints, corners, cameraMatrix, distCoeffs, rvecs.at(i), tvecs.at(i)); cv::drawFrameAxes(outputImage, cameraMatrix, distCoeffs, rvecs[i], tvecs[i], 0.1, 2); } m_Pixmap = cvMatToQPixmap(outputImage); emit newPixmapCaptured(); } }
问题解决
按照建议修改相机初始化代码后,方向识别异常的问题已解决:
// f[px] = x[px] * z[m] / x[m] float focalLen = 950 * 1.3f / 0.45f; cv::Matx33f cameraMatrix(focalLen, 0.0f, (1280-1) / 2.0f, 0.0f, focalLen, (780-1) / 2.0f, 0.0f, 0.0f, 1.0f);
内容的提问来源于stack exchange,提问作者JMA
相关产品推荐
相关产品推荐

