2012-03-14 6 views
1

私はビデオフィードのコーナーを検出するためにCV CVASTアルゴリズムを使用しようとしています。メソッド呼び出しとセットアップはかなり単純ですが、私はいくつかの問題にぶち当たっています。OpenCV cv :: FASTに関する問題がある

OpenCVのエラー:私がしようとすると、このコード

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

    } 

を使用するとき、私はこのエラーを取得するアサーションが不明 機能、ファイルに(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のエラー:不正チャンネル数(このためのチャネルの数が正しくありませんが、 ERSIONコードをCONV)未知の機能では、ファイル........ \ OCV \ OpenCVの\ SRC \ CVを\ cvcolor.cpp 、line 2238

IplImageの代わりにIplImageを使用してキャプチャしようとしましたが、同じ種類のエラーが発生しています。

何か提案や助けがありますか? ありがとうございます。あなたがOpenCVのAPIを使用して問題を持っているときはいつでも、ソースコードで利用可能なテスト/例を見に行く

#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

:ちょうど誰のためにそれを容易にするために

ファイル全体fast.cpp

この練習は非常に役に立ち、教育的にはです。

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

は確かに、かなりまっすぐ進むようだ:あなたがそのコードを見ている場合さて、あなたは画像がそれにcv::FAST()を呼び出す前にグレースケールに変換されることがわかります。

+1

私は、APIを介して見て、オンラインの周り探してかなりの時間を過ごしました。私はちょうど正しい場所を見ていないと思う。ポインタありがとう。 – dipsmac

+0

サンプルのファーストコードは非常に古くなっています。また、エラーが修正されなかったものの、Matタイプを使用する必要があります.IplImageは推奨されていません。 –

3

はあなたが読むことができる

cvCvtColor(img,tempImg,CV_8U); 

cvCvtColor(img,tempImg,CV_BGR2GRAY); 

への変更必要this

グッドラック

1
私が以前働いていたコードと同じメッセージが出始め

、私はマットがU8グレースケールであることを確信していました。私が処理しようとしていた画像の1つがもう存在しないことが判明しました。だから、私の場合は誤解を招くエラーメッセージでした。

1

このサンプルコードをご覧ください。使用しているコードはかなり古くなったopencvに見えますが、このサンプルでは、​​フィーチャディテクタをどのように使用するべきかを見ていきます。 サンプルはいくつかのフィーチャディテクタ(FASTを含む)のために一般的ですので、少し複雑に見えるようです。

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

また、親ディレクトリでより多くのサンプルがあります。

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"); 
関連する問題