2012-03-14 87 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");