Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用OpenCV提取文本和边界框_Opencv_Image Processing_Extract_Ocr_Bounding Box - Fatal编程技术网

使用OpenCV提取文本和边界框

使用OpenCV提取文本和边界框,opencv,image-processing,extract,ocr,bounding-box,Opencv,Image Processing,Extract,Ocr,Bounding Box,我试图在图像中找到文本的边界框(矩形)。所以,我喜欢一次扫描整个图像,得到所有文本区域。问题是很少有文字被忽略,也很少有文字被塞满。分组应该是逐字的。它不应该由一个以上的单词组合在一起。每个单词都应该有自己的矩形。我使用下面给出的代码 int COCR::method_gradient(int nonGradient, int showOutput) { Mat large = imread(INPUT_FILE); Mat rgb; rgb = large; //--> change

我试图在图像中找到文本的边界框(矩形)。所以,我喜欢一次扫描整个图像,得到所有文本区域。问题是很少有文字被忽略,也很少有文字被塞满。分组应该是逐字的。它不应该由一个以上的单词组合在一起。每个单词都应该有自己的矩形。我使用下面给出的代码

int COCR::method_gradient(int nonGradient, int showOutput)
{
Mat large = imread(INPUT_FILE);
Mat rgb;

rgb = large;  //--> change

Mat small;
cvtColor(rgb, small, CV_BGR2GRAY);

// morphological gradient
Mat grad;
Mat morphKernel;

if (!nonGradient)
{
    morphKernel = getStructuringElement(MORPH_ELLIPSE, Size(3, 3));
    morphologyEx(small, grad, MORPH_GRADIENT, morphKernel);
}
else
    grad = small;


// 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));

if (nonGradient)
    rgb = MatGradient;

// 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 > .25 /* assume at least 25% of the area is filled if it contains text */
        &&
        (rect.height > 8 && rect.width > 8) 
        )
    {
        rectangle(rgb, rect, Scalar(0, 255, 0), 2);
    }
}

if (!nonGradient)
    MatGradient = rgb;

if (showOutput)
    imwrite(OUTPUT_FOLDER_PATH, rgb);

return 0;
}

// calling
COCR obj_ocr;   
obj_ocr.method_gradient(0, 0);
obj_ocr.method_gradient(1, 1);
int-COCR::方法_梯度(int-nonGradient,int-showOutput)
{
Mat large=imread(输入文件);
Mat-rgb;
rgb=大;//-->更改
垫小;
CVT颜色(rgb,小,CV_bgr2灰色);
//形态梯度
垫梯度;
无核;
如果(!非激进)
{
morphKernel=getStructuringElement(变形椭圆,大小(3,3));
形态学(小,梯度,形态梯度,形态核);
}
其他的
梯度=小;
//二值化
Mat bw;
阈值(梯度、bw、0.0、255.0、二元阈值、大津阈值);
//连接水平方向的区域
垫子连接;
morphKernel=getStructuringElement(MORPH_RECT,Size(9,1));
morphologyEx(bw,连通,MORPH_-CLOSE,morphKernel);
//寻找轮廓
Mat mask=Mat::zeros(bw.size(),CV_8UC1);
矢量等值线;
向量层次;
findContours(连通、轮廓、层次、CV_RETR_CCOMP、CV_CHAIN_近似、简单、点(0,0));
if(非梯度)
rgb=梯度;
//过滤轮廓
对于(int idx=0;idx>=0;idx=hierarchy[idx][0])
{
Rect Rect=boundingRect(等高线[idx]);
Mat maskROI(蒙版,矩形);
maskROI=标量(0,0,0);
//填充轮廓
绘制等高线(遮罩、等高线、idx、标量(255、255、255)、CV_填充);
//填充区域中非零像素的比率
double r=(double)countNonZero(maskROI)/(矩形宽度*矩形高度);
如果(r>.25/*假设包含文本,则至少填充了25%的区域*/
&&
(矩形高度>8和矩形宽度>8)
)
{
矩形(rgb,rect,标量(0,255,0),2);
}
}
如果(!非激进)
MatGradient=rgb;
如果(显示输出)
imwrite(输出文件夹路径,rgb);
返回0;
}
//召唤
COCR obj_ocr;
光学字符识别方法梯度法(0,0);
光学字符识别法梯度法(1,1);
请注意红色部分。

请看红色部分。


请告知我如何纠正红色eclipse中显示的缺失区域。

将关闭从9,1更改为5,1修复了这两幅图像

// connect horizontally oriented regions
cv::Mat connected;
morphKernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 1));
cv::morphologyEx(bw, connected, cv::MORPH_CLOSE, morphKernel);

有自己的尝试吗?没有,没有。我想让它更好地满足我的需要。将
findcontours()
参数
CV\u RETR\u CCOMP
更改为
CV\u RETR\u EXTERNAL
。比x,效果更好。它现在正在接受漏掉的单词,但它没有孤立这些单词。它仍然将3个或更多的单词组合成一个单词。请建议。您可以降低它,更像cv::Size(3,1)(总是需要奇数)