2012-03-14 429 views
1

我正在尝试使用开放式CV FAST算法来检测来自视频源的角点。方法调用和设置似乎非常简单,但我遇到了一些问题。当我尝试使用此代码OpenCV有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 \简历\(这个通道数不正确CONV 版为代码) cvcolor.cpp ,line 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; 

}

回答

6

只要你有使用OpenCV的API去检查源代码的测试/可用实例的一个问题:fast.cpp

这种做法是非常有用的和教育。现在,如果你看看代码,你会发现,图像被转换调用它cv::FAST()之前灰度:

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

似乎相当直接的,确实如此。

+1

我已通过API看,花了相当多的时间四处寻找在线。猜猜我只是没有找到正确的地方。感谢指针。 – dipsmac 2012-03-14 23:41:30

+0

快速代码示例非常过时。此外,虽然它没有解决您的错误,但您应该使用Mat类型,不推荐使用IplImage。 – 2012-06-09 17:26:53

3

您需要更改此

cvCvtColor(img,tempImg,CV_8U); 

cvCvtColor(img,tempImg,CV_BGR2GRAY); 

您可以阅读this

好运

1

我开始与代码相同的消息曾经工作,我确定我的Mat是U8灰度。事实证明,我正在尝试处理的图像中有一张不再存在。所以在我的情况下,这是一个误导性的错误信息。

0

请按照下面的代码来得到您想要的结果。对于展示一个例子,我只考虑一个形象,但你可以简单地使用相同的理念,为视频帧

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");