【问题标题】:OpenCV Having issues with cv::FASTOpenCV 遇到 cv::FAST 问题
【发布时间】:2012-03-14 21:49:57
【问题描述】:

我正在尝试使用开放式 CV FAST 算法来检测视频源中的角点。方法调用和设置似乎很简单,但我遇到了一些问题。当我尝试使用此代码时

  while(run)
{
    clock_t begin,end;
    img = cvQueryFrame(capture);

    key = cvWaitKey(10);


    cvShowImage("stream",img);
    //Cv::FAST variables
    int threshold=9;
    vector<KeyPoint> keypoints;

    if(key=='a'){
        //begin = clock();


        Mat mat(tempImg);

        FAST(mat,keypoints,threshold,true);
        //end = clock();
        //cout << "\n TIME FOR CALCULATION: " << double(diffClock(begin,end)) << "\n" ;

    }

我收到此错误:

OpenCV 错误:断言失败 (image.data && image.type() == CV_8U) 未知 函数,文件........\ocv\opencv\src\cvaux\cvfast.cpp,第 6039 行

所以我认为这是图像深度的问题,所以当我添加这个时:

    IplImage* tempImg = cvCreateImage(Size(img->width,img->height),8,1);
        cvCvtColor(img,tempImg,CV_8U);

我明白了:

OpenCV 错误:通道数错误(此转换的通道数不正确 版本代码)在未知函数中,文件........\ocv\opencv\src\cv\cvcolor.cpp ,第 2238 行

我尝试使用 Mat 而不是 IplImage 进行捕获,但我不断收到相同类型的错误。

有什么建议或帮助吗? 提前致谢。

整个文件只是为了方便任何人:

    #include "cv.h"
    #include "cvaux.hpp"
    #include "highgui.h"

    #include <time.h>
    #include <iostream>



    double diffClock(clock_t begin, clock_t end);

    using namespace std;
    using namespace cv;

    int main(int argc, char** argv)
    {
//Create Mat img for camera capture 
IplImage* img;
bool run = true;

CvCapture* capture= 0;
capture = cvCaptureFromCAM(-1);
int key =0;
cvNamedWindow("stream", 1);

while(run)
{
    clock_t begin,end;
    img = cvQueryFrame(capture);

    key = cvWaitKey(10);


    cvShowImage("stream",img);
    //Cv::FAST variables
    int threshold=9;
    vector<KeyPoint> keypoints;

    if(key=='a'){
        //begin = clock();
        IplImage* tempImg = cvCreateImage(Size(img->width,img->height),8,1);
        cvCvtColor(img,tempImg,CV_8U);

        Mat mat(img);

        FAST(mat,keypoints,threshold,true);
        //end = clock();
        //cout << "\n TIME FOR CALCULATION: " << double(diffClock(begin,end)) << "\n" ;

    }
    else if(key=='x'){
        run= false;
    }
}
cvDestroyWindow( "stream" );
return 0;

}

【问题讨论】:

    标签: c++ c visual-c++ opencv


    【解决方案1】:

    当您在使用 OpenCV API 时遇到问题时,请检查源代码中提供的测试/示例:fast.cpp

    这种做法非常有用且具有教育意义。现在,如果您查看该代码,您会注意到图像在调用cv::FAST() 之前已转换为灰度:

    Mat mat(tempImg);
    Mat gray;
    cvtColor(mat, gray, CV_BGR2GRAY);
    FAST(gray,keypoints,threshold,true);
    

    确实看起来很简单。

    【讨论】:

    • 我浏览了 API 并花了相当多的时间在网上四处寻找。我想我只是没有找对地方。谢谢指点。
    • 该示例快速代码非常过时。此外,虽然它没有解决您的错误,但您应该使用 Mat 类型,不推荐使用 IplImage。
    【解决方案2】:

    你需要改变这个

    cvCvtColor(img,tempImg,CV_8U);
    

    cvCvtColor(img,tempImg,CV_BGR2GRAY);
    

    您可以阅读this

    祝你好运

    【讨论】:

      【解决方案3】:

      我开始收到与以前有效的代码相同的消息,并且我确定我的 Mat 是 U8 灰度。事实证明,我试图处理的其中一张图像不再存在。所以在我的情况下,这是一个误导性的错误消息。

      【讨论】:

        【解决方案4】:

        看看这个示例代码。您使用的代码看起来已经过时了 opencv,在这个示例中,您会发现现在应该如何使用特征检测器。 该示例适用于多个特征检测器(包括 FAST),因此看起来有点复杂。

        http://code.opencv.org/projects/opencv/repository/entry/branches/2.4/opencv/samples/cpp/matching_to_many_images.cpp

        您还将在父目录中找到更多示例。

        【讨论】:

          【解决方案5】:

          请按照以下代码获得您想要的结果。为了展示一个例子,我只考虑一个图像,但你可以简单地对视频帧使用相同的想法

          Mat img = imread("IMG.jpg", IMREAD_UNCHANGED);
          if( img.empty())
            {
              cout << "File not available for reading"<<endl;
              return -1;
            }
          Mat grayImage;
          if(img.channels() >2){
             cvtColor( img, grayImage, CV_BGR2GRAY ); // converting color to gray image
              }
          else{
             grayImage =  img;
          }
          double sigma = 1;
          GaussianBlur(grayImage, grayImage, Size(), sigma, sigma); // applying gaussian blur to remove some noise,if present
          
          int thresholdCorner = 40;
          vector<KeyPoint> keypointsCorners;
          FAST(grayImage,keypointsCorners,thresholdCorner,true); // applying FAST key point detector
          if(keypointsCorners.size() > 0){
             cout << keypointsCorners.size() << endl;
          }
          // Drawing a circle around corners
          for( int i = 0; i < keypointsCorners.size(); i++ )
             {
                 circle( grayImage, keypointsCorners.at(i).pt, 5,  Scalar(0), 2, 8, 0 );
             }
          cv::namedWindow("Display Image");
          cv::imshow("Display Image", grayImage);
          cvWaitKey(0);
          cvDestroyWindow( "Display Image" );
          

          【讨论】:

            猜你喜欢
            • 2013-06-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-01-14
            • 2017-04-24
            • 1970-01-01
            相关资源
            最近更新 更多