Come tradurre questa elaborazione di immagini da Matlab a OpenCV?

Il link sottostante utilizza Matlab per rimuovere il contenuto non di testo da un’immagine. Voglio fare la stessa cosa con OpenCV in Java.

Non ho un Matlab da provare e sono nuovo di OpenCV. Sebbene conosca alcune nozioni di base sulla teoria alla base del processo, ma è piuttosto difficile rendere la traduzione dal linguaggio Matlab in OpenCV 3.0. E preferibilmente in Java.

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

ADD 1 – rilevamento della regione con MSER (non ancora risolto)

Per il rilevamento di MSER, posso utilizzare il seguente codice per rilevare i punti chiave 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); } 

}

    E l’output è simile a questo: inserisci la descrizione dell'immagine qui

    Ma non so come convertire i punti chiave in regioni. Quello di cui ho bisogno è qui sotto:

    inserisci la descrizione dell'immagine qui

    ADD 2 – Bordi Canny e intersezione con regioni MSER (non ancora risolti)

    Una volta che sono riuscito a trovare le regioni MSER, dovrei intersect it with Canny edges . Posso trovare alcuni bordi Canny come sotto. Ma non so come fare l’operazione di 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); } 

    L’output dei bordi casuali si presenta in questo modo: inserisci la descrizione dell'immagine qui

    AGGIUNGI 3 – Ora mi sono rivolto a utilizzare VS 2013 Community

    Per configurare OpenCV con VS2013, controllare qui .

    ADD 4 – Coding in VC ++ 2013

    Di seguito è quello che ho cercato per ora con riferimento a qui .

     //Step2: Detect MSER regions Mat grayImage; cvtColor(colorImage, grayImage, CV_BGR2GRAY); imshow("Gray Image", grayImage); waitKey(0); Ptr 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> mserContours; vector 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 v : mserContours){ for (cv::Point p : v){ vis2.at(py, px) = 255; } } imshow("MSER by points", vis); waitKey(0); 

    Quello che ho ottenuto sono questi:

    vis1 - MSER by contours inserisci la descrizione dell'immagine qui

    vis2 - MSER by points inserisci la descrizione dell'immagine qui

    AGGIUNGI 5

    Ho appena sperimentato l’ esempio di rilevamento del testo come suggerito da Miki . Richiede alcuni file di modello addestrati per l’esecuzione. E ci sono voluti quasi 2 minuti per finire, ma possiamo lasciare la performance più tardi. Il mio scenario è quello dei testi OCR di schermate complesse (mi dispiace rivelarlo fino ad ora). Anche se il risultato è abbastanza buono per le scene naturali. Non è così attraente per gli screenshot. Di seguito è il risultato:

    inserisci la descrizione dell'immagine qui

    Pubblicare come risposta solo per mostrare il risultato dell’esempio di rilevamento del testo OpenCV

    inserisci la descrizione dell'immagine qui

    Ora è necessario applicare il riconoscimento del testo, usando ad esempio OCRHMMDecoder

    Troverete un esempio qui