Gracias a todos por responder esta pregunta. He encontrado mi error Voy a describirlo en breve a continuación. Espero que ayude a otros a enfrentar este problema.
1) He ejecutado los comandos C y C++ en una imagen de ROI. Aparentemente, la forma en que las API OpenCV 'C' y 'C++' tratan el ROI es diferente.
2) En 'C', un ROI se trata como una imagen completamente diferente. Por lo tanto, cuando ejecuta funciones como cvSmooth, cvDilate, etc., donde es necesario mencionar los métodos de extrapolación de píxeles de borde, la API 'C' no hace referencia a la imagen original para píxeles más allá del píxel izquierdo/derecho/superior/inferior.En realidad, interpola los valores de píxel de acuerdo con el método que mencionaste.
3) Pero en 'C++', he encontrado que siempre se refiere a la imagen original para píxeles más allá de la izquierda/derecha/arriba/abajo del pixel. Por lo tanto, el método de extrapolación de píxeles de borde mencionado no afecta su resultado si hay píxeles en la imagen original alrededor de su ROI.
Creo que aplica el método de extrapolación de píxeles de pedido a la imagen original en lugar del ROI a diferencia de la API 'C'. No sé si esto es un error; No he leído completamente la documentación de la API OpenCV 2.4.2 C++. (Por favor, corríjanme si me equivoco)
para reclamar mi apoyo, me han publicado imágenes de entrada/salida por debajo de:
salida de 'C' y API C++:
ENTRADA:
input http://i48.tinypic.com/35jm9n5.png < --- entrada
OpenCV 'C' API:
IplImage *src = cvLoadImage("input.png", 0);
cvSetImageROI(src, cvRect(33,19,250,110));
cvSaveImage("before_gauss.png", src);
cvSmooth(src, src, CV_GAUSSIAN);
cvSaveImage("after_gauss.png", src);
IplConvKernel *element = cvCreateStructuringElementEx(3,3,1,1,CV_SHAPE_RECT);
cvCanny(src, src, 140, 40);
cvSaveImage("after_canny.png", src);
cvDilate(src, src, element, 5);
cvSaveImage("dilate.png", src);
SALIDA:
before_gauss http://i45.tinypic.com/345lybm.png < - before_gauss
after_gauss http://i45.tinypic.com/2rg1jm0.png < --- after_gauss
after_canny http://i46.tinypic.com/2ymhyqw.png < --- after_canny
dilate http://i48.tinypic.com/5u4ec1.png < --- dilatar
OpenCV 'C++' API:
cv::Mat src = cv::imread("input.png", 0);
cv::Mat src_ROI = src(cv::Rect(33,19,250,110));
cv::imwrite("before_gauss.png", src_ROI);
cv::GaussianBlur(src_ROI, src_ROI, cv::Size(3,3),0);
cv::imwrite("after_gauss.png", src_ROI);
cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3), cv::Point(1,1));
cv::Canny(src_ROI, src_ROI, 140, 40);
cv::imwrite("after_canny.png", src_ROI);
cv::dilate(src_ROI, src_ROI, element, cv::Point(1,1), 5);
cv::imwrite("dilate.png", src_ROI);
SALIDA:
before_gauss http://i45.tinypic.com/345lybm.png < - before_gauss
after_gauss http://i50.tinypic.com/28gxzrb.png
^^^^^ after_gauss (NOTA: las fronteras no son una más completamente negro, son grisáceas)
after_canny http://i45.tinypic.com/2la7ecp.png
^^^^^ after_canny
dilate http://i50.tinypic.com/jhqxbm.png
^^^^^ dilatan
SOLUCIÓN:
Crear una copia ROI independiente y usarla para un análisis posterior;
src_ROI.copyTo(new_src_ROI);
Utilice new_src_ROI para un análisis posterior. Si alguien tiene una mejor solución, publique debajo de
¿Puede incluir la imagen original? –
@ HåvardGeithus: Entrada: http://i47.tinypic.com/9kthzm.png; La imagen de entrada es una salida de borde astuta como se muestra. –