Я застрял в этой проблеме в течение нескольких дней;Программа вылетает при использовании cv :: findContours с Qt Gui
Я создал проект консоли Qt, связал его с OpenCV, и все работало нормально;
Я создал проект Qt Gui, добавил кнопку и скопировал один и тот же код из предыдущего проекта в слот кнопки, я получил окно segFault и программу, выходящую с кодом -1073741819.
Таким образом, я использовал отладчик для обнаружения проблемы, и оказалось, что он использует функцию 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);
}
Использование:
для Windows 7 x64
OpenCV 2.4.0 составлен с использованием MinGW 4.1.0
Qt Creator 2.0.0 на основе Qt 4.7.0 (32 бит)
Edit:
вот более короткая версия моего кода:
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
отображалось, что означает изображение было загружено!.
загруженного проект here
, когда я изменил 'cv :: Point' на' cv :: Point2f' Я получил 'Недопустимый параметр передан функции времени выполнения C.' как для 'threshold', я использовал его, а затем вернулся в Canny (начиная с это дает те же результаты) Вот вывод изображения, когда я вызываю функцию из конструктора ! [фото] (http://img11.imageshack.us/img11/5268/outputxv.png) Очевидно, что код работает. Проблема в том, почему она не работает, когда я нажимаю QButton? – Isma
Пожалуйста, загрузите образец проекта, который я буду тестировать. –
Сообщение отредактировано. Добавлен проект. – Isma