【问题标题】:Error: OpenCV 3.4.0 CUDA ORB feature detection错误:OpenCV 3.4.0 CUDA ORB 特征检测
【发布时间】:2019-01-10 12:25:35
【问题描述】:

我正在使用 ORB 检测器来检测视频帧的关键点,但它给了我以下错误:

OpenCV Error: Assertion failed (img.type() == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3))) in detectAsync

ORB 检测器的 CPU 功能工作正常。但不知何故,对于 GPU,它无法检测到图像的关键点。我也尝试过使用来自 CUDA 的 FastFeatureDetector,但它也失败了。

我在下面附上我的代码:

int main()
{
   cv::VideoCapture input("/home/admin/Pictures/cars.mp4");

   // Create image matrix
   cv::Mat img,desc;
   cv::cuda::GpuMat obj1;

   // create vector keypoints
   std::vector<cv::KeyPoint>keypoints;

   // create keypoint detector
   cv::Ptr<cv::cuda::ORB> detector = cv::cuda::ORB::create();

   for(;;)
   {
       if(!input.read(img))
           break;
       obj1.upload(img);
       detector->detect(obj1,keypoints, cv::cuda::GpuMat());
       obj1.download(desc);
       //Create cricle at keypoints
       for(size_t i=0; i<keypoints.size(); i++)
          cv::circle(desc, keypoints[i].pt, 2,cv::Scalar(0,0,255),1);

       // Display Image
       cv::imshow("img", desc);
       char c = cv::waitKey();

       // NOTE: Press any key to run the next frame
       // Wait for a key to press
       if(c == 27) // 27 is ESC key code
           break;
    }
}

主要问题是检测器将CV_8UC1作为Mat的输入格式。但我的图像格式是 CV_8UC3。我尝试使用img.convertTo(img1, CV_8UC1)转换该图像,但它仍然无法处理并抛出错误OpenCV Error: Bad flag (parameter or structure field) (Unrecognized or unsupported array type) in cvGetMat。

【问题讨论】:

    标签: c++ opencv computer-vision


    【解决方案1】:

    您必须将图像从 CV_8UC3 - 3 通道图像转换为 CV_8UC1 - 单通道(灰度)图像。为此,只需调用

    cv::cvtColor(img, img, cv::BGR2GRAY);
    

    在将数据上传到 GPU 之前。

    【讨论】:

    • 谢谢...知道为什么它不采用 convertTo() 函数获得的输出吗?
    • 看这个帖子:stackoverflow.com/questions/22174002/…。长话短说 - convertTo 用于更改数据类型而不是通道数
    猜你喜欢
    • 2018-04-21
    • 2011-11-06
    • 2013-03-18
    • 2018-01-15
    • 2019-09-19
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多