OpenCV Проблемы с cv :: FAST - PullRequest
       1

OpenCV Проблемы с cv :: FAST

1 голос
/ 15 марта 2012

Я пытаюсь использовать открытый алгоритм 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;
* *} Тысяча двадцать-один

Ответы [ 5 ]

6 голосов
/ 15 марта 2012

Всякий раз, когда у вас возникают проблемы с использованием OpenCV API, проверяйте тесты / примеры, доступные в исходном коде: fast.cpp

Эта практика чрезвычайно полезна и полезна .Теперь, если вы посмотрите на этот код, то заметите, что изображение преобразуется в оттенки серого, прежде чем вызывать cv::FAST() для него:

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

На самом деле это выглядит довольно просто.

3 голосов
/ 15 марта 2012

Вам нужно изменить это

cvCvtColor(img,tempImg,CV_8U);

На

cvCvtColor(img,tempImg,CV_BGR2GRAY);

Вы можете прочитать это

Удачи

1 голос
/ 09 июня 2012

Взгляните на этот пример кода. Код, который вы используете, выглядит довольно устаревшим opencv, в этом примере вы узнаете, как использовать детекторы функций сейчас. Пример является общим для нескольких детекторов функций (включая FAST), поэтому он выглядит немного сложнее.

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

Вы также найдете больше образцов в родительском каталоге.

1 голос
/ 09 июня 2012

Я начал получать то же сообщение с кодом, который работал ранее, и я был уверен, что мой мат был в шкале серого U8Оказалось, что одного из изображений, которые я пытался обработать, уже не было.Так что в моем случае это было ошибочное сообщение об ошибке.

0 голосов
/ 13 декабря 2016

Пожалуйста, следуйте приведенному ниже коду, чтобы получить желаемый результат.Для показа примера я рассматриваю только изображение, но вы можете просто использовать ту же идею для видеокадров

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" );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...