matlab opencv computer-vision matlab-cvst opencv3.0

¿Cómo traducir este procesamiento de imágenes de Matlab a OpenCV?



computer-vision matlab-cvst (1)

El siguiente enlace utiliza Matlab para eliminar contenido que no es de texto de una imagen. Quiero hacer lo mismo con OpenCV en Java.

No tengo un Matlab para probar y soy nuevo en OpenCV. Aunque sé algunos conceptos básicos sobre la teoría detrás del proceso, pero es un poco difícil hacer la traducción del lenguaje Matlab a OpenCV 3.0. Y preferiblemente en Java.

http://www.mathworks.com/help/vision/examples/automatically-detect-and-recognize-text-in-natural-images.html

ADD 1 - detección de región con MSER (aún no resuelto)

Para la detección de MSER, puedo usar el siguiente código para detectar los puntos clave de MSER.

public static void MSERdetector(String imgName1, String suffix1) { Mat imgMat1 = Imgcodecs.imread(picDir + imgName1 + "." + suffix1, Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE); String outImgName1 = picDir + "MSER" + "_keypoints_" + imgName1 + "_" + ".tif"; Mat outImg1 = new Mat(); FeatureDetector featureDetector = FeatureDetector.create(FeatureDetector.MSER); // create the feature detector MatOfKeyPoint keypoints1 = new MatOfKeyPoint(); featureDetector.detect(imgMat1, keypoints1); if (!keypoints1.empty()) { Features2d.drawKeypoints(imgMat1, keypoints1, outImg1); Imgcodecs.imwrite(outImgName1, outImg1); System.out.println("done"); } else { System.out.println("No keypoints found for: " + imgName1); }

}

Y la salida se ve así:

Pero no sé cómo convertir puntos clave en regiones. Lo que necesito es a continuación:

ADD 2 - Canny bordes e intersección con regiones MSER (no resuelto aún)

Una vez que pueda encontrar las regiones MSER, se supone que debo cruzarlo intersect it with Canny edges . Puedo encontrar algunos bordes Canny como a continuación. Pero no sé cómo hacer la operación de intersection .

public static void CANNYedge(String imgName1, String suffix1) { Mat imgMat1 = Imgcodecs.imread(picDir + imgName1 + "." + suffix1, Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE); //imgMat1 = ImageUtilities.Convert2BW(imgMat1); String outImgName1 = picDir + "_CANNY_" + imgName1 + ".tif"; Mat outImg1 = new Mat(); Imgproc.Canny(imgMat1, outImg1, 0, 500); Imgcodecs.imwrite(outImgName1, outImg1); }

Mi salida de bordes astutos se ve así:

AGREGAR 3 - Ahora di vuelta para usar la Comunidad VS 2013

Para configurar OpenCV con VS2013, marque aquí .

ADD 4 - Codificación en VC ++ 2013

Debajo está lo que probé por ahora con referencia aquí .

//Step2: Detect MSER regions Mat grayImage; cvtColor(colorImage, grayImage, CV_BGR2GRAY); imshow("Gray Image", grayImage); waitKey(0); Ptr<MSER> mserExtractor = MSER::create(); // create MSER extractor with default parameters. http://code.opencv.org/projects/opencv/wiki/MSER http://docs.opencv.org/master/d3/d28/classcv_1_1MSER.html#a49d72a1346413106516a7fc6d95c09bb mserExtractor->setMinArea(150); mserExtractor->setMaxArea(2000); //Mat mserOutMask = Mat::zeros(grayImage.rows, grayImage.cols, CV_8UC3); Mat vis; //vis = Mat::zeros(grayImage.rows, grayImage.cols, CV_8UC3); grayImage.copyTo(vis); vector<vector<Point>> mserContours; vector<Rect> mserBBox;//what''s this? mserExtractor->detectRegions(grayImage, mserContours, mserBBox); for (int i = 0; i<mserContours.size(); i++) { drawContours(vis, mserContours, i, Scalar(255, 255, 255), 4); } imshow("MSER by contours", vis); waitKey(0); Mat vis2; grayImage.copyTo(vis2); for (vector<cv::Point> v : mserContours){ for (cv::Point p : v){ vis2.at<uchar>(p.y, p.x) = 255; } } imshow("MSER by points", vis); waitKey(0);

Lo que obtuve son estos:

vis1 - MSER by contours

vis2 - MSER by points

ADD 5

Acabo de experimentar con la muestra de detección de texto sugerida por Miki . Requiere que se ejecuten algunos archivos de modelo entrenados. Y tardó casi 2 minutos en terminar, pero podemos dejar el rendimiento más tarde. Mi escenario es para textos OCR de capturas de pantalla complejas (lo siento para revelar que hasta ahora). Aunque el resultado es bastante bueno para escenas naturales. No es tan atractivo para capturas de pantalla. Debajo está el resultado: