我正在使用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
,但它们编译得很好。真是奇怪啊。
我也遇到了这个问题(虽然我使用的是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 (无需实例化检测器)