私はこの問題に何日も悩まされてきました。
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
が表示されたので、画像が読み込まれました。
アップロードされたプロジェクトはこちら