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ş
Sonra varMatRegions
ben geldiğimde bu görüntü alıyorum:
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.
CEVAP
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;
}
Açılan listeden seçili metin (seçim ku...
HTML dosyası Python kullanarak açılan ...
Nasıl varsayılan metin ve açılan kutu ...
Ne başlangıç ne zaman en son açılan do...
set metin tarafından açılan jquery kul...