这是我的第一个openCV程序,如果我对某些基本的计算机视觉概念一无所知,那就宽恕吧.
更新:由于sturkmen的回答,请查看底部的新代码/新问题
我正在努力将一大堆图像"数字化",就像附加的图像一样,作为一个项目.所有图像都来自同一来源.最终目标是将提取的文本块传递给tesseract,即OCR库.
(源代码在底部) 我将解释我当前的方法,然后陈述我的问题.
我目前的做法如下:
应用反二进制阈值
扩张图像并找到轮廓 
boundingRect从每个轮廓创建一个,然后过滤最小和最大尺寸
这工作正常

我期望的最终结果是boundingRect每列周围有一个.因此,对于提供的图片,其中有七个.
因此,问题在于图像中的列表"迷你部分"未被可靠地拾取(最好的例子是最右边的列中没有boundingRect围绕它的那个).
我可以想到两个可能的解决方案(以便不是一个开放式/意见类型的问题),但如果你知道一个更好的解决方案,请分享它!
1)组合boundingRect垂直邻居的s来捕获列.包含可能的边缘情况故障.
2)找到一种不同的方法来处理图像,然后再找到轮廓.根据我的研究,运行长度平滑算法看起来很有前景?
所以我的问题是,哪种方法最好?我忽略了一个更好的解决方案吗?我在这个部门缺乏经验,所以没有任何建议太小.
谢谢阅读!
#include "opencv2/core.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
using namespace cv;
using namespace std;
int main(int argc, char* argv[])
{
Mat image = imread(path_to_file);
Mat gray;
cvtColor(image, gray, COLOR_BGR2GRAY);
Mat fin;
double thresh = threshold(gray, fin, 160, 255, THRESH_BINARY_INV);
//size impacts dilation
Mat kernel …Run Code Online (Sandbox Code Playgroud) 问题:大约一周前,为了更好地提高Tesseract的准确性,我添加了一个高斯模糊/ OTSU二值化组合,产生漂亮的二进制图像,如附加的.我在openCV中这样做,所以我传递给Tesseract的图像已经是二进制图像(如附图所示).当Tesseract对图像进行预处理时(即使是下面发布的图像),图像也会损坏,因此不会产生有意义的输出.请参阅示例输入下方的图像,了解Tesseract对图像所做的操作.
问题的根源是高斯模糊.如果我删除它,Thresholded image那个tesseract输出没有乱码,但它也不像我附加的二进制图像那样干净和可读.我可以禁用Tesseract预处理我传递的图像吗?为什么Guassian模糊完全破坏了Tesseract?我觉得输入图像就像我所附的图像一样清晰,准确性会提高.
两个图像都属于同一列.首先是输入图像,第二是Tesseract图像预处理的结果.
输入TESSERACT示例:
TESSERACT CORRUPTION(获自GetThresholdedImage():
我对这个问题的希望(参见底部)希望对我的放气过程进行尽可能多的布置,并且我可以(可能非常)误解了我所在的领域。希望最后,这个问题可以成为一个方便的资源。
前两个字节等于zlib压缩的标头,格式为(credit)
---CMF--- ---FLG---
0111.1000 1101.0101
CINF -CM- +-||
| |+- FCHECK
| +-- FDICT
+---- FLEVEL
Run Code Online (Sandbox Code Playgroud)
从RFC 1950开始,从右到左:
FCHECK(1.0101)-验证CMF和FLG为16位无符号整数是31的倍数
FDICT(0)-如果设置,表示在FLG之后紧随其后的预设DICT
FLEVEL(11)-压缩“强度” [0-3]
CM(1000)-用于压缩方法,其中CM = 8 ==“放气”压缩方法
CINF(0111)-指示使用的滑动窗口的大小,其中CINF = 7 == 32K滑动窗口
NEW BYTE中的后三位等于霍夫曼编码块的标头:
---CMF--- ---FLG--- NEW BYTE
0111.1000 1101.0101 11101100
|-|
| +- BFINAL
+--- BTYPE
Run Code Online (Sandbox Code Playgroud)
从RFC 1951右到左:
BFINAL(0)-如果这是最后一个数据块,则设置为(1)
BTYPE(10)-霍夫曼编码:(00)无;(01)修正霍夫曼码;(10)动态代码;(11)无效
从这里开始,我将假设BTYPE =(10)
下列值会立即进行:
NEW BYTE NXT BYTE
(11101)100 -> 101)(11101) -> 0111111(1
|-|
| +- BFINAL
+--- BTYPE
Run Code Online (Sandbox Code Playgroud)
HLIT (11101)-5位长度/文字代码,增加了257个(257-286) …
我想过把它放在超级用户或其他东西上,但由于我的问题与编译后发生的事情有关,我认为这是最好的.
我的系统: ubuntu 14.04 g++ 4.9
我试图在我的C++程序中使用tesseract.
因此,经过相当的努力,我得到了tesseract安装时没有错误安装.我的问题是,在编译和运行我的程序后,我得到了看似罕见的错误:
index >= 0 && index < size_used_:Error:Assert failed:in file ../ccutil/genericvector.h, line 512
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)
我可以找到的关于这个错误的一点点是它有时可能是由于缺少语言数据引起的,但是根据这个,我在适当的文件夹中看到了所有正确的文件.
软件版本:tesseract 3.02.02,leptonica-1.71,libjpeg 8d : libpng 1.2.50 : libtiff 4.0.3 : zlib 1.2.8
我的tesseract安装源:这里.我开始尝试tesseract 3.03,但它会失败make.
我使用这些标志编译没有警告:
g++ -Wall -std=c++11 alt_2.cpp -ggdb `pkg-config --cflags opencv` `pkg-config --cflags tesseract` -o alt_2 `pkg-config --libs opencv` `pkg-config --libs tesseract`
Run Code Online (Sandbox Code Playgroud)
这是我使用tesseract的代码:
#include "tesseract/baseapi.h"
...
tesseract::TessBaseAPI tess;
tess.Init(NULL, lang, tesseract::OEM_DEFAULT);
tess.SetPageSegMode(tesseract::PSM_SINGLE_BLOCK); …Run Code Online (Sandbox Code Playgroud)