0

私はこの問題に何日も悩まされてきました。

Qt コンソール プロジェクトを作成し、それを OpenCV に接続すると、すべてが正常に機能しました。

Qt Gui プロジェクトを作成し、ボタンを追加し、前のプロジェクトから同じコードをボタンのスロットにコピーしました。Windows segFault が発生し、プログラムはコード -1073741819 で終了しました。

そのため、デバッガーを使用して問題を検出したところ、 function を使用していることが判明しましたcv::threshold

私はそれを変更して代わりに使用しcv::Cannyましたが、同じ問題が発生しましたcv::findContours!

奇妙なことに、ウィンドウのコンストラクターでボタンの 'MainWindow::on_pushButton_clicked()' を呼び出すと、機能しました!!!

デバッガーの出力は次のとおりです。

0 cv::thresh_8u(cv::Mat const&, cv::Mat&, unsigned char, unsigned char, int) C:\OpenCV2.4\OpenMinGw\install\bin\libopencv_imgproc240.dll 0 0x62b2c624  
1 cv::_InputArray::getMat(int) const C:\OpenCV2.4\OpenMinGw\install\bin\libopencv_core240.dll 0 0x65c1a838  
2 ?? 0 0x00000000  

エラーが発生する関数は次のとおりです(OpenCVチュートリアルから取得しました):

void MainWindow::on_pushButton_clicked(){

    Mat src; Mat src_gray;
    int thresh = 100;
    RNG rng(12345);
    Mat canny_output;

    vector<vector<Point> > contours;

    /// Load source image and convert it to gray
    src = imread( "hat-10.bmp", 1 );

    cvtColor( src, src_gray, CV_BGR2GRAY );
    blur( src_gray, src_gray, Size(3,3) );

    /// Detect edges using canny
    Canny( src_gray, canny_output, thresh, thresh*2, 3 );
    qDebug("Ok 1");

    /// Find contours
    if(cv::sum(src_gray).val[0] > 0.0){

        qDebug("Ok 2");
        cv::findContours( src_gray, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE );
        /// Draw contours
        Mat drawing = Mat::zeros( src_gray.size(), CV_8UC3 );
        for( int i = 0; i< contours.size(); i++ )
        {
            Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
            drawContours( drawing, contours, i, color, 2);//, 8, hierarchy, 0, Point() );
        }
        /// Show in a window
        imshow( "Contours", drawing);

    }

使用:

  • ウィンドウズ 7 x64

  • mingw 4.1.0 を使用してコンパイルされた OpenCV 2.4.0

  • Qt Creator 2.0.0 Qt 4.7.0 (32 ビット) ベース

編集:

ここに私のコードの短いバージョンがあります:

void MainWindow::on_toolButton_clicked(){
 std::vector<std::vector<cv::Point> > contours;

/// Load source image and convert it to gray
Mat src = imread( "C:/Users/poste/L3 ISIL/PFE Licence/new bmp/hat-10.bmp", 1);
// my image is already a binary one
Mat canny_output(src.size(), src.type());

Canny(src,canny_output,100,200,3);

imshow("Source",  canny_output); // here image is displayed before crash
waitKey(500);

/// Find contours
findContours(canny_output, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE );

}

コンソールモードでは問題ありません。GUI アプリ コンストラクターから呼び出された場合も問題ありません。実際にボタンをクリックしたときにのみクラッシュします。

編集: スクリーンショットを撮りました ![こちら] http://i.stack.imgur.com/1LyeF.png canny_outputが表示されたので、画像が読み込まれました。

アップロードされたプロジェクトはこちら

4

3 に答える 3

0

最初に、しきい値を設定する画像が実際にグレー スケールの画像であることを確認します。しきい値処理後、別のウィンドウで表示します。

cv::FindContours の前にそれを行います:

cvThreshold(originalImage,resultingImage,100,100,CV_THRESH_BINARY) 

また、次のように変更します。

vector<vector<Point> > contours;

to:

vector<vector<cv::Point2f> > contours;
于 2013-03-30T14:45:33.377 に答える
0

これを試して:

/// Load source image and convert it to gray
Mat src = imread( "hat-10.bmp", 1 );

Mat src_gray(src.size(), CV_8U);
cvtColor( src, src_gray, CV_BGR2GRAY );

blur( src_gray, src_gray, Size(3,3) );

//Apply threshold
cv::Mat thres_output(src_gray.size(), src_gray.type());
cv::threshold(src_gray, thres_output, 100, 255, cv::THRESH_BINARY);
qDebug("Ok 1");

OpenCV ドキュメントには、 Basic Thresholding Operationsに関する完全なデモがあります。

編集:

コードとコメントを注意深く確認したところ、何が起こっているのかがわかったと思います。これらの問題はimread()、指定されたファイルにアクセスできないために発生している可能性があります。これにより、関数は空の を返しますMat。これが当てはまるかどうかを確認するには、次のようにします。

Mat src = imread( "hat-10.bmp", 1 );
if (src.empty())
{
    std::cout << "!!! imread failed to open image\n";
    return;
}

これは、Qt Creator がプロジェクトの.exeを別のフォルダーにビルドするため、アプリケーションを実行すると、.exe が起動されたディレクトリからイメージを読み込もうとし、イメージが存在しないために失敗するためです。そこにいない。

呼び出すときimread()は、ファイルに FULL PATH を渡すことを忘れないでください。問題が解決するかどうかを確認してください。

編集

にフィードする前に、画像をバイナリに変換することを忘れないでくださいfindContours():

// Convert from 32F to 8U
cv::Mat binary_img;
canny_output.convertTo(binary_img, CV_8U);

std::vector<std::vector<cv::Point> > contours;
cv::findContours(binary_img, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
于 2013-03-30T18:37:49.707 に答える