2011-12-18 10 views
1

を使用するとエラーが発生し、エラーが発生します。それはコンパイルされますが、実行しようとすると、次のエラーが発生します。OpenCVこのコードをコンパイルして実行するときにimgproc関数

アプリケーションが異常終了するようにランタイムを要求しました。

これはコードです:

#include <opencv2/opencv.hpp> 
#include <string> 

int main() { 
    cv::VideoCapture c(0); 
    double rate = 10; 
    bool stop(false); 
    cv::Mat frame; 
    cv::namedWindow("Hi!"); 
    int delay = 1000/rate; 
    cv::Mat corners; 
    while(!stop){ 
     if(!c.read(frame)) 
      break; 
     cv::cornerHarris(frame,corners,3,3,0.1); 
     cv::imshow("Hi!",corners); 
     if(cv::waitKey(delay)>=0) 
      stop = true; 
    } 
    return 0; 
} 

キャニーエッジ検出器を使用する場合にところで、私は同じエラーを取得します。

+0

いただきましたエラーがですか? – Sam

答えて

0

行列は変数として宣言されていますが、割り当てられたメモリはありません。あなたのframe変数と同じです。まず、画像が収まる大きさの行列を作成する必要があります。

最初にcvCreateImageを見ることをお勧めします。ビデオストリームの操作を開始する前に、基本的な画像の作成方法と処理方法を知ることができます。

+0

ねえ、コードが間違っているかもしれませんが、問題は割り当てられたmemではありません。 C++関数は必要に応じてメモリを割り当てます。したがって、空の出力行列で呼び出すことはできます。自動的に作成されます。 – Sam

+0

ええ、はい、ポインタではありません。 cvCannyやimshowのような関数は、cv構造体のMatとiplImageへのポインタを必要としませんか? – vsz

+1

この場合、C++インターフェイスはCインターフェイスと非常に異なります。彼らは必要に応じて、望ましい出力を割り当てることができるスマートなポインタ(単純なポインタではない)を期待しています。 'if(dst.empty)のように|| dst.size()!= CORRECT_SIZE || .. different_type){dst.deallocate(); dst.allocate(CORRECT_SIZE_AND_TYPE)} ' – Sam

0

キャプチャの準備ができていることを確認し、そして画像はokです:

if(!cap.IsOpened()) 
    break; 

if(!c.read(frame)) 
     break; 

if(frame.empty()) 
    break; 
0

あなたは、コーナー検出器を使用する前にグレースケールに画像を変換する必要があります。

cv::Mat frameGray; 
cv::cvtColor(frame, frameGray, CV_RGB2GRAY); 
関連する問題