SORU
6 Mayıs 2014, Salı


Açılan metin OpenCV

Görüntüdeki metin sınırlayıcı kutuları bulmaya çalışıyorum ve şu anda bu yaklaşımı kullanıyorum:

// calculate the local variances of the grayscale image
Mat t_mean, t_mean_2;
Mat grayF;
outImg_gray.convertTo(grayF, CV_32F);
int winSize = 35;
blur(grayF, t_mean, cv::Size(winSize,winSize));
blur(grayF.mul(grayF), t_mean_2, cv::Size(winSize,winSize));
Mat varMat = t_mean_2 - t_mean.mul(t_mean);
varMat.convertTo(varMat, CV_8U);

// threshold the high variance regions
Mat varMatRegions = varMat > 100;

Böyle bir görüntü verilmiş

enter image description here

Sonra varMatRegions ben geldiğimde bu görüntü alıyorum:

enter image description here

Biraz kalabalıklaştı kartları bu yöntem iyi çalışıyor en kartları için kart başlığı ile, ama metin sol blok birleştirir gördüğünüz gibi sorunlara neden olabilir.

Bu hatlarını bağlamak için kötü olmasının nedeni kontur sınırlayıcı kutusu neredeyse tüm kart almak yapar.

Herkes metin doğru algılama sağlamak için metin bulabilirim farklı bir yol önerir misiniz?

Bu yukarıdaki iki kart içinde metin bul. kim için 200 puan.

enter image description here enter image description here

CEVAP
15 Mayıs 2014, PERŞEMBE


Programda Gradyan tabanlı bir yöntem aşağıda kullandım. Katma elde edilen görüntüleri. Lütfen işlem için resmin küçültülmüş versiyonu kullanıyorum unutmayın.

#include "stdafx.h"

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

using namespace cv;
using namespace std;

#define INPUT_FILE              "1.jpg"
#define OUTPUT_FOLDER_PATH      string("")

int _tmain(int argc, _TCHAR* argv[])
{
    Mat large = imread(INPUT_FILE);
    Mat rgb;
    // downsample and use it for processing
    pyrDown(large, rgb);
    Mat small;
    cvtColor(rgb, small, CV_BGR2GRAY);
    // morphological gradient
    Mat grad;
    Mat morphKernel = getStructuringElement(MORPH_ELLIPSE, Size(3, 3));
    morphologyEx(small, grad, MORPH_GRADIENT, morphKernel);
    // binarize
    Mat bw;
    threshold(grad, bw, 0.0, 255.0, THRESH_BINARY | THRESH_OTSU);
    // connect horizontally oriented regions
    Mat connected;
    morphKernel = getStructuringElement(MORPH_RECT, Size(9, 1));
    morphologyEx(bw, connected, MORPH_CLOSE, morphKernel);
    // find contours
    Mat mask = Mat::zeros(bw.size(), CV_8UC1);
    vector<vector<Point>> contours;
    vector<Vec4i> hierarchy;
    findContours(connected, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
    // filter contours
    for(int idx = 0; idx >= 0; idx = hierarchy[idx][0])
    {
        Rect rect = boundingRect(contours[idx]);
        Mat maskROI(mask, rect);
        maskROI = Scalar(0, 0, 0);
        // fill the contour
        drawContours(mask, contours, idx, Scalar(255, 255, 255), CV_FILLED);
        // ratio of non-zero pixels in the filled region
        double r = (double)countNonZero(maskROI)/(rect.width*rect.height);

        if (r > .45 /* assume at least 45% of the area is filled if it contains text */
            && 
            (rect.height > 8 && rect.width > 8) /* constraints on region size */
            /* these two conditions alone are not very robust. better to use something 
            like the number of significant peaks in a horizontal projection as a third condition */
            )
        {
            rectangle(rgb, rect, Scalar(0, 255, 0), 2);
        }
    }
    imwrite(OUTPUT_FOLDER_PATH   string("rgb.jpg"), rgb);

    return 0;
}

enter image description here enter image description here enter image description here

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • curioustravelers

    curioustrave

    12 AĞUSTOS 2006
  • Goran Dimov

    Goran Dimov

    1 HAZİRAN 2014
  • Modus Recordings

    Modus Record

    26 Kasım 2008