我正在做一个有趣的项目:使用OpenCV从输入图像中解决数独(如Google护目镜等).我完成了任务,但最后我发现了一个问题,我来到这里.
我使用OpenCV 2.3.1的Python API进行编程.
以下是我的所作所为:
找到角点.
例如,如下:

(请注意,绿线正确地与Sudoku的真实边界重合,因此可以正确扭曲数独.查看下一张图片)
将图像扭曲成完美的正方形
例如:

执行OCR(我使用我在OpenCV-Python中的简单数字识别OCR中给出的方法)
而且方法效果很好.
问题:
看看这个图像.
在此图像上执行第4步,结果如下:

绘制的红线是原始轮廓,它是数独边界的真实轮廓.
绘制的绿线是近似轮廓,它将是扭曲图像的轮廓.
当然,在数独的上边缘绿线和红线之间存在差异.因此,在翘曲时,我没有得到数独的原始边界.
我的问题 :
如何在数独的正确边界上扭曲图像,即红线,或者如何消除红线和绿线之间的差异?在OpenCV中有没有这方法?
我最近遇到了Tesseract和OpenCV.看起来Tesseract是一个成熟的OCR引擎,OpenCV可以用作创建OCR应用程序/服务的框架.
我尝试在我的一些图像上使用Tesseract,它的准确性似乎不错.后来,我遇到了一个非常简单的使用OpenCV来使用Python执行OCR的教程,并给人留下了深刻的印象.几分钟后,我完成了系统的培训,其准确性很好.但是,当然,采用这种方法意味着我需要使用大型训练集来广泛训练我的系统.
我的具体问题如下:
有什么建议?
注意:我24小时在计算机视觉领域,但我愿意花时间和精力学习先决条件.
我在iPhone上使用OpenCV,需要检测图像中的数字.我将图像分割成较小的图像,因此每个图像只有一个数字(1-9).所有数字都是打印的,不是手写的.
用OpenCV算出数字的最佳方法是什么?
更新:
我已成功找到数字并将其提取出来.它们看起来像这样:
http://img198.imageshack.us/img198/5671/101ht.jpg
http://img824.imageshack.us/img824/539/606yu.jpg
提取它们时,它们的大小相同,依此类推.我已经保存了一堆图像并将它们放在OCR目录中,在那里它们被分类为数字.喜欢:ocr/1/100.jpg 101.jpg ....和ocr/2/200.jpg 201.jpg ....
然后我将使用与Basic OCR教程相同的方法:http://blog.damiles.com/?p = 93
但是,我正在为iPhone编程,不能使用C++代码(编译时出错等),我无法访问highgui.
我尝试使用cvMatchTemplate()并匹配一堆图像,但它看起来很糟糕......
我可以尝试其他任何想法吗?
我正在编写一个Android应用程序来从图片中提取数独谜题.对于9x9 Sudoku网格中的每个单元格,我需要确定它是否包含数字1到9之一或是空白.我从像这样的Sudoku开始:

我使用OpenCV预处理数独,以提取各个数字的黑白图像,然后通过Tesseract将它们放入.但Tesseract有一些限制:
tesseract.setVariable("tessedit_char_whitelist", "123456789");
我有三个问题:
我试图以某种方式改进OCR的字符识别,但我最好的结果是:结果. 
甚至在这张照片上的tesseract也不承认任何角色.我的代码是:
#include <cv.h> // open cv general include file
#include <highgui.h> // open cv GUI include file
#include <iostream> // standard C++ I/O
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <string>
using namespace cv;
int main( int argc, char** argv )
{
Mat src;
Mat dst;
Mat const structure_elem = getStructuringElement(
MORPH_RECT, Size(2,2));
src = imread(argv[1], CV_LOAD_IMAGE_COLOR); // Read the file
cvtColor(src,src,CV_BGR2GRAY);
imshow( "plate", src );
GaussianBlur(src, src, Size(1,1), 1.5, 1.5);
imshow( "blur", src );
equalizeHist(src, src);
imshow( "equalize", src …Run Code Online (Sandbox Code Playgroud) 现在我正在尝试使用OpenCV创建数字识别系统.WEB中有很多文章和例子(甚至在StackOverflow上).我决定使用KNN分类器,因为这个解决方案在WEB中最受欢迎.我找到了一个手写数字数据库,训练集为60k,错误率低于5%.
我使用本教程作为如何使用OpenCV使用此数据库的示例.我使用完全相同的技术和测试数据(t10k-images.idx3-ubyte)我有4%的错误率.但是当我尝试对自己的数字进行分类时,我会遇到更大的错误.例如:
被认定为7
和
被认可为5
和
被认定为1
被认可为8等等(如果需要,我可以上传所有图像).
正如您所看到的,所有数字都具有良好的质量,并且易于识别.
所以我决定在分类之前做一些预处理.从上表MNIST数据库的网站,我发现人们使用歪斜校正,去除噪声,模糊和像素移位技术.不幸的是,几乎所有文章的链接都被打破了.所以我决定自己做这样的预处理,因为我已经知道如何做到这一点.
现在,我的算法如下:
我认为在我的情况下不需要去偏移,因为所有数字通常都是旋转的.而且我也不知道如何找到合适的旋转角度.所以在这之后我得到了这些图像:
也是1
是3(以前不是5)
是5(不是8)
是7(利润!)所以,这样的预处理对我有所帮助,但我需要更好的结果,因为在我看来,这些数字应该被认可而没有问题.
任何人都可以通过预处理给我任何建议吗?谢谢你的帮助.
PS我可以上传我的源代码(c ++)代码.
我正试图从游戏板中提取一个项目的信件.目前,我可以检测游戏板,将其分割成各个方块并提取每个方块的图像.
我得到的输入是这样的(这些是单独的字母):






起初,我正在计算每个图像的黑色像素数,并将其用作识别不同字母的方法,这对于受控输入图像效果较好.但是,我遇到的问题是,对于与这些图像略有不同的图像,我无法做到这一点.
我每个字母大约有5个样本用于培训,这应该足够好了.
有谁知道什么是一个好的算法用于此?
我的想法是(在图像标准化后):
任何帮助,将不胜感激!
在EmguCV中应用于图像进行文本识别的最佳图像预处理操作是什么?
我在这里包含了两个样本图像.
应用低通或高通滤波器将不合适,因为文本可以是任何尺寸.我尝试了中位数和双边滤波器,但它们似乎并没有太大影响图像.
理想的结果是二进制图像,所有文本都是白色的,其余大部分是黑色的.然后将该图像发送到OCR引擎.
谢谢
我使用OpenCV中的letter_regcog示例,它使用了UCI的数据集,其结构如下:
Attribute Information:
1. lettr capital letter (26 values from A to Z)
2. x-box horizontal position of box (integer)
3. y-box vertical position of box (integer)
4. width width of box (integer)
5. high height of box (integer)
6. onpix total # on pixels (integer)
7. x-bar mean x of on pixels in box (integer)
8. y-bar mean y of on pixels in box (integer)
9. x2bar mean x variance (integer)
10. y2bar mean y variance (integer)
11. xybar … 有人试图获取仅在python中调用tesseract 4.0的最新版本的数字吗?
下面的代码在3.05中有效,但在4.0中仍返回字符,我尝试删除所有配置文件,但数字文件仍然无效。任何帮助都会很棒:
im是日期的图像,黑色文本白色背景:
import pytesseract
im = imageOfDate
im = pytesseract.image_to_string(im, config='outputbase digits')
print(im)
Run Code Online (Sandbox Code Playgroud)