В спешке находя что проблема, с которой сталкиваются люди склонны забывать более важный вопрос: как -The-черт-ду-я-найти-проблема .
В приложениях для обработки изображений на how может ответить отладчик бедняка в OpenCV, , который добавляет cvSaveImage()
звонки через код к быть в состоянии визуализировать то, что делает каждый шаг пути:
//Pre-processing phase
cvCvtColor(origImage, grayImage, CV_BGR2GRAY);
cvSaveImage("cv_color.jpg", grayImage);
cvDilate(grayImage, grayImage, NULL, 1);
cvSaveImage("cv_dilate.jpg", grayImage);
cvSmooth(grayImage, grayImage, CV_GAUSSIAN, 21, 21, 0, 0);
cvSaveImage("cv_smooth.jpg", grayImage);
cvThreshold(grayImage, binImage, 120, 255, CV_THRESH_BINARY);
cvSaveImage("cv_threshold.jpg", binImage);
cvNormalize(binImage,binImage,0,1,CV_MINMAX);
cvSaveImage("cv_normalize.jpg", binImage);
Этот код показывает, что получающееся изображение становится черным еще до того, как пользовательский цикл for
, и вызов, который отвечает за это cvNormalize()
. Но это имеет смысл правильно? Вы преобразуете пиксели в диапазоне [0..255] в значения 0 и 1.
Так что проблема в том, что в конце обработки, когда вы сохраняете полученное изображение на диск, вы забыли нормализовать значения обратно к исходному диапазону :
IplImage *cropImage = cvCreateImage(cvGetSize(binImage), 8, 1);
cvCopy(binImage, cropImage, NULL);
cvNormalize(cropImage, cropImage, 0, 255, CV_MINMAX);
cvSaveImage("result.jpg", cropImage);
И это решает проблему.