Вы забыли сказать, можете ли вы видеть оригинальное изображение, отображаемое на экране.
Я никогда не устаю говорить людям, что проверка возврата функций обязательна!
Рассмотрим IplImage* img = cvLoadImage("images/00000038.jpg");
, как вы можете определить, была ли эта функция выполнена успешно или нет? Насколько я могу судить, ошибка, которая у вас возникла, может быть связана с ошибкой функции до вызова cvCanny()
.
Во всяком случае, я недавно опубликовал код , который использует cvCanny для улучшения обнаружения круга . Вы можете проверить этот код и посмотреть, что вы делаете по-другому.
EDIT
Ваша проблема в этом случае заключается в том, что вы переходите к входу и выходу cvCanny в виде 3-канального изображения, когда оно принимает только одноканальное изображение. Проверьте документы :
void cvCanny (постоянное CvArr * изображение, CvArr * ребра, двойной порог1, двойной порог2, int aperture_size = 3)
Implements the Canny algorithm for edge detection.
Parameters:
* image – Single-channel input image
* edges – Single-channel image to store the edges found by the function
* threshold1 – The first threshold
* threshold2 – The second threshold
* aperture_size – Aperture parameter for the Sobel operator (see Sobel)
Итак, измените свой код на:
// Create an image to hold our modified input image
IplImage* out = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
// Do some smoothing
//cvSmooth(img, out, CV_GAUSSIAN, 3, 3);
IplImage* gray = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
cvCvtColor(img, gray, CV_BGR2GRAY);
// Do some Edge detection
cvCanny(gray, out, 10, 20, 3);