错误:‘ArucoDetector’不是‘cv::aruco’的成员

问题描述 投票:0回答:1

我正在使用OpenCV C++在ROS中构建一个程序来检测ArUco代码。我的OpenCV版本是4.2。 我已经包含了头文件:

 #include <opencv2/aruco.hpp>.
并调用了该函数:
cv::aruco::ArucoDetector detector(dictionary, detectorParams);

在编写这行代码时,vscode 可以提供自动补全功能,并允许我导航到该函数的定义文件。但是当我编译时,出现错误。

error: ‘ArucoDetector’ is not a member of ‘cv::aruco’

如何解决这个问题?是什么导致了这个问题?

我的代码如下。

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


//#include <opencv2/objdetect/aruco_detector.hpp>

#include <Eigen/Dense>
#include <iostream>

#include "ros/ros.h"
#include "sensor_msgs/Image.h"
#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>


static const std::string OPENCV_WINDOW = "Image window";

class ImageConverter
{
    ros::NodeHandle nh_;
    image_transport::ImageTransport it_;
    image_transport::Subscriber image_sub_;
public:
    ImageConverter()
    : it_(nh_)
    {
        // Subscrive to input video feed and publish output video feed
        image_sub_ = it_.subscribe("/robot/camera/image", 1,&ImageConverter::imageCb, this);
        cv::namedWindow(OPENCV_WINDOW);
    }
     ~ImageConverter()
    {
        cv::destroyWindow(OPENCV_WINDOW);
    }
 
    void imageCb(const sensor_msgs::ImageConstPtr& msg)
    {
        cv_bridge::CvImagePtr cv_ptr;
        try
        {
            cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);
        }
        catch (cv_bridge::Exception& e)
        {
            ROS_ERROR("cv_bridge exception: %s", e.what());
            return;
        }

        cv::Mat img =  cv_ptr->image;
        cv::Mat img_copy = img.clone();
        cv::Mat img_gray;
        //cv::imshow("test_opencv", img);
        cv::cvtColor(img, img_gray, cv::COLOR_BGR2GRAY);

        cv::aruco::DetectorParameters detectorParams = cv::aruco::DetectorParameters();
        cv::aruco::Dictionary dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250);
        cv::aruco::ArucoDetector detector(dictionary, detectorParams);
  }
};

int main(int argc, char *argv[])
{
    ros::init(argc, argv, "opencv_test");
    ImageConverter ic;
    ros::spin();
    return 0;
}

错误信息如下。

/home/zhilinxu/catkin_ws_webots/src/vis_ser_demo01/src/main.cpp: In member function ‘void ImageConverter::imageCb(const ImageConstPtr&)’:
/home/zhilinxu/catkin_ws_webots/src/vis_ser_demo01/src/main.cpp:94:20: error: ‘ArucoDetector’ is not a member of ‘cv::aruco’
   94 |         cv::aruco::ArucoDetector detector(dictionary, detectorParams);
      |                    ^~~~~~~~~~~~~
make[2]: *** [vis_ser_demo01/CMakeFiles/demo01.dir/build.make:63: vis_ser_demo01/CMakeFiles/demo01.dir/src/main.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:902: vis_ser_demo01/CMakeFiles/demo01.dir/all] Error 2
make: *** [Makefile:141: all] Error 2
Invoking "make -j20 -l20" failed

看来

cv::aruco::ArucoDetector
是在头文件
opencv2/objdetect/aruco_detector.hpp
中定义的,已经包含在
opencv2/aruco.hpp
中了。当尝试在代码中直接包含
opencv2/objdetect/aruco_detector.hpp
时,我在编译过程中遇到了重新定义错误。

在我的代码中,

cv::aruco::DetectorParameters
cv::aruco::Dictionary
都来自
opencv2/objdetect/aruco_detector.hpp
,但它们编译得很好。真是奇怪啊。

c++ opencv cmake ros aruco
1个回答
0
投票

我也遇到了这个问题(虽然我使用的是cv 4.5),并且发现api似乎已经改变了

而不是这个:

cv::aruco::DetectorParameters detectorParams = cv::aruco::DetectorParameters();
cv::aruco::Dictionary dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250);

cv::aruco::ArucoDetector detector(dictionary, detectorParams);

detector.detectMarkers(inputImage, markerCorners, markerIds);

我们最终得到这个:

cv::Ptr<cv::aruco::Dictionary> dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250);
cv::aruco::detectMarkers(inputImage, dictionary, markerCorners, markerIds);

注意字典中使用了 cv::Ptr ,以及静态函数 detectorMarkers (无需实例化检测器)

© www.soinside.com 2019 - 2024. All rights reserved.