相关疑难解决方法(0)

OpenCV-Python中的简单数字识别OCR

我正在尝试在OpenCV-Python(cv2)中实现"数字识别OCR".它仅用于学习目的.我想在OpenCV中学习KNearest和SVM功能.

我有每个数字的100个样本(即图像).我想和他们一起训练.

letter_recog.pyOpenCV示例附带了一个示例.但我仍然无法弄清楚如何使用它.我不明白什么是样本,响应等.另外,它首先加载一个txt文件,我首先不明白.

稍后搜索一下,我可以在cpp示例中找到一个letter_recognition.data.我使用它并在letter_recog.py模型中为cv2.KNearest创建了一个代码(仅用于测试):

import numpy as np
import cv2

fn = 'letter-recognition.data'
a = np.loadtxt(fn, np.float32, delimiter=',', converters={ 0 : lambda ch : ord(ch)-ord('A') })
samples, responses = a[:,1:], a[:,0]

model = cv2.KNearest()
retval = model.train(samples,responses)
retval, results, neigh_resp, dists = model.find_nearest(samples, k = 10)
print results.ravel()
Run Code Online (Sandbox Code Playgroud)

它给了我一个20000的数组,我不明白它是什么.

问题:

1)letter_recognition.data文件是什么?如何从我自己的数据集构建该文件?

2)什么results.reval()表示?

3)我们如何使用letter_recognition.data文件(KNearest或SVM)编写简单的数字识别工具?

python ocr opencv numpy computer-vision

370
推荐指数
3
解决办法
21万
查看次数

在一组cv :: Point上执行cv :: warpPerspective以进行伪偏移

我正在尝试对一组点进行透视变换以实现偏斜效果:

http://nuigroup.com/?ACT=28&fid=27&aid=1892_H6eNAaign4Mrnn30Au8d

我正在使用下面的图像进行测试,绿色矩形显示感兴趣的区域.

我在想,如果有可能实现,我希望使用的简单组合的效果cv::getPerspectiveTransformcv::warpPerspective.我正在分享我到目前为止所写的源代码,但它不起作用.这是结果图像:

因此,有一个vector<cv::Point>定义感兴趣的区域,但点不存储在任何特定的顺序载体内,这件事情我不能在检测过程中发生改变.无论如何,稍后,向量中的点用于定义a RotatedRect,而这又用于组装cv::Point2f src_vertices[4];,所需的变量之一cv::getPerspectiveTransform().

我对顶点及其组织方式的理解可能是其中一个问题.我还认为使用a RotatedRect不是存储ROI原始点的最佳方法,因为坐标会稍微改变以适应旋转的矩形,这并不是很酷.

#include <cv.h>
#include <highgui.h>
#include <iostream>

using namespace std;
using namespace cv;

int main(int argc, char* argv[])
{
    cv::Mat src = cv::imread(argv[1], 1);

    // After some magical procedure, these are points detect that represent …
Run Code Online (Sandbox Code Playgroud)

c++ opencv image-processing perspective skew

57
推荐指数
4
解决办法
4万
查看次数

快速图像阈值处理

什么是快速可靠的阈值图像可能模糊和不均匀亮度的方法?

示例(模糊但亮度均匀):

在此输入图像描述

由于不保证图像具有均匀的亮度,因此使用固定阈值是不可行的.自适应阈值可以正常工作,但由于模糊,它会在特征中产生断裂和扭曲(这里,重要的特征是数独数字):

在此输入图像描述

我也尝试过使用直方图均衡(使用OpenCV的equalizeHist功能).它可以增加对比度而不会降低亮度差异.

我发现的最佳解决方案是将图像按其形态结束(信用到此帖子)来划分,使亮度均匀,然后重新归一化,然后使用固定阈值(使用Otsu算法选择最佳阈值水平):

在此输入图像描述

以下是OpenCV for Android中的代码:

Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(19,19));
Mat closed = new Mat(); // closed will have type CV_32F
Imgproc.morphologyEx(image, closed, Imgproc.MORPH_CLOSE, kernel);
Core.divide(image, closed, closed, 1, CvType.CV_32F);
Core.normalize(closed, image, 0, 255, Core.NORM_MINMAX, CvType.CV_8U);
Imgproc.threshold(image, image, -1, 255, Imgproc.THRESH_BINARY_INV
    +Imgproc.THRESH_OTSU); 
Run Code Online (Sandbox Code Playgroud)

这很有效,但关闭操作非常慢.减小结构元素的尺寸会增加速度但会降低精度.

编辑:根据DCS的建议,我尝试使用高通滤波器.我选择了拉普拉斯滤波器,但我希望Sobel和Scharr滤波器具有相似的结果.滤波器在不包含特征的区域中拾取高频噪声,并且由于模糊而遭受与自适应阈值类似的失真.它也需要与关闭操作一样长.以下是15x15过滤器的示例:

在此输入图像描述

编辑2:根据AruniRC的回答,我使用建议的参数在图像上使用Canny边缘检测:

double mean = Core.mean(image).val[0];
Imgproc.Canny(image, image, 0.66*mean, 1.33*mean);
Run Code Online (Sandbox Code Playgroud)

我不确定如何可靠地自动微调参数以获得连接的数字.

在此输入图像描述

opencv image-processing threshold

29
推荐指数
1
解决办法
2万
查看次数

OpenCV中的图像转换

这个问题与这个问题有关: How to remove convexity defects in sudoku square

我是想实现nikie's answerMathematica to OpenCV-Python.但我陷入了程序的最后一步.

即我得到了正方形的所有交叉点,如下所示:

在此输入图像描述

现在,我想将其转换为一个完美的大小正方形(450,450),如下所示:

在此输入图像描述

(不要介意两个图像的亮度差异).

问题: 如何在OpenCV-Python中执行此操作?我正在使用cv2版本.

python opencv wolfram-mathematica computer-vision

22
推荐指数
1
解决办法
1万
查看次数

如何使用 OpenCV 获取数独网格的单元格?

过去几天我一直在尝试从图片中获取数独网格,并且一直在努力获取网格的较小方块。我正在处理下面的图片。我认为用精明的过滤器处理图像会正常工作,但它没有,我无法获得每个正方形的每个轮廓。然后我将自适应阈值、otsu 和经典阈值化进行测试,但每次似乎都无法捕捉到每个小方块。

最终目标是获取包含数字的单元格,并使用 pytorch 识别数字,所以我真的很想拥有一些干净的数字图像,这样识别就不会出错:)

有没有人知道如何实现这一目标?非常感谢!:D

我正在使用的数独网格

python opencv image image-processing sudoku

20
推荐指数
2
解决办法
5019
查看次数

模糊图像的自适应阈值

我有一个相当模糊的数独谜题的432x432图像,其自适应阈值不好(取5x5像素的块大小,然后减去2):

在此输入图像描述

正如你所看到的,数字略有扭曲,其中有很多破损,而且有5s融入6s和6s融入8s.此外,还有很多噪音.为了修复噪声,我必须使用高斯模糊使图像更加模糊.然而,即使是相当大的高斯内核和自适应阈值blockSize(21x21,减去2)也无法消除所有断点并将数字融合在一起甚至更多:

在此输入图像描述

我还尝试在阈值处理后扩展图像,这与增加blockSize有类似的效果; 并且锐化图像,这在某种程度上没有太大作用.我还应该尝试什么?

opencv image-processing threshold

16
推荐指数
2
解决办法
2万
查看次数

opencv:检测棋盘角落的最佳方法

背景

所以我正在创建一个识别国际象棋动作的程序.到目前为止,我已经实施了相当多的算法来提供最好的结果.我到目前为止所发现的是,对图像进行无失真(使用无失真),然后应用直方图均衡算法,最后使用goodFeaturesToTrack算法(我发现这比哈里斯角点检测更好)的组合产生相当不错的效果结果.这里的目标是让每个广场的每个角落都有一个点.这样,当我应用canny边缘检测时,我可以处理单个方块.

在此输入图像描述

我考虑过什么

http://www.nandanbanerjee.com/index.php?option=com_content&view=article&id=71:buttercup-chess-robot&catid=78&Itemid=470

总结上面的链接,我们的想法是找到最左上角,最右上角,最左下角和最右下角的点,并将它们之间的距离除以8.从那里你会想出可能的点,并将它们与实际上在板上的点进行比较.如果其中一个点不匹配,只需替换该点.

我也考虑过某种模式,比如查找相邻点之间的距离并将它们存储在列表中.然后我会执行模式操作以找出最可能的距离并使用它来绘制点.

正如你所看到的,这些点在大多数方块上都相当准确(尽管有些随机点不符合我的要求).我的问题是你认为在棋盘上找到所有角落的最佳方法是什么(我对所有想法都持开放态度)你能给我一些详细的描述(足以引导我朝正确的方向或更多如果你选择:)?此外,(这是次要问题)您是否有任何关于如何进行以便最佳识别移动的建议?我正在尝试实现多种方式,并且我将比较方法以获得最佳结果!谢谢.

algorithm opencv

14
推荐指数
1
解决办法
8331
查看次数

模糊图像的阈值 - 第2部分

如何对此模糊图像进行阈值处理以使数字尽可能清晰?

在上一篇文章中,我尝试自适应地对模糊图像进行阈值处理(左图),这会导致数字失真和断开(右图):

在此输入图像描述

从那时起,我已经使用如所描述的形态学闭运算试图此篇使图像均匀的亮度:

在此输入图像描述

如果我自适应地对此图像进行阈值处理,则不会获得明显更好的结果.但是,由于亮度大致均匀,我现在可以使用普通阈值:

在此输入图像描述

这比以前好多了,但我有两个问题:

  1. 我不得不手动选择阈值.尽管关闭操作导致均匀的亮度,但是对于其他图像,亮度水平可能不同.
  2. 在阈值水平略有变化的情况下,图像的不同部分会做得更好.例如,左上角的9和7部分褪色并且应该具有较低的阈值,而6中的一些已经融合成8s并且应该具有更高的阈值.

我认为回到自适应阈值,但是具有非常大的块大小(图像的1/9)将解决这两个问题.相反,我最终得到一个奇怪的"光环效应",其中图像的中心更亮,但边缘与正常阈值图像大致相同:

在此输入图像描述

编辑:remi 建议在形态上打开这篇文章右上角的阈值图像.这不太好用.使用椭圆内核,只有3x3足够小,以避免完全消除图像,即使这样,数字也会有明显的破损:

在此输入图像描述

Edit2:mmgp 建议使用维纳滤镜来消除模糊.我将此代码用于OpenCV中的Wiener过滤到OpenCV4Android,但它使图像更加模糊!这是使用我的代码和5x5内核过滤之前(左)和之后的图像:

在此输入图像描述

这是我改编的代码,它就地过滤:

private void wiener(Mat input, int nRows, int nCols) { // I tried nRows=5 and nCols=5

    Mat localMean = new Mat(input.rows(), input.cols(), input.type());
    Mat temp = new Mat(input.rows(), input.cols(), input.type());
    Mat temp2 = new Mat(input.rows(), input.cols(), input.type());

    // Create the kernel for convolution: a constant matrix with nRows rows 
    // and nCols cols, normalized so that the sum of the …
Run Code Online (Sandbox Code Playgroud)

opencv image-processing threshold

10
推荐指数
4
解决办法
6329
查看次数

从Contour OpenCV中提取矩形

在进行一些边缘和角点检测然后找到轮廓后,我有这个输出.

如何裁剪此图像并使用openCV仅返回此矩形

编辑:

我尝试了cvBoundingRect然后setimageROI但输出图像仍然有一些背景但我只想要矩形

谢谢.

图片链接

c c++ opencv objective-c

8
推荐指数
1
解决办法
4206
查看次数

如何使用opencv从皮肤图像中删除头发?

我正在努力识别皮肤斑点.为此,我使用了许多具有不同噪声的图像.这些噪音中的一个是毛发,因为我在污渍区域(ROI)上有毛发的图像.如何减少或消除这些类型的图像噪音?

下面的代码减少了毛发的区域,但不会去除感兴趣区域(ROI)上方的毛发.

import numpy as np
import cv2

IMD = 'IMD436'
# Read the image and perfrom an OTSU threshold
img = cv2.imread(IMD+'.bmp')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, thresh =     cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)

# Remove hair with opening
kernel = np.ones((2,2),np.uint8)
opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel, iterations = 2)

# Combine surrounding noise with ROI
kernel = np.ones((6,6),np.uint8)
dilate = cv2.dilate(opening,kernel,iterations=3)

# Blur the image for smoother ROI
blur = cv2.blur(dilate,(15,15))

# Perform another OTSU threshold and search for biggest contour
ret, thresh =     cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) …
Run Code Online (Sandbox Code Playgroud)

python opencv image image-processing

7
推荐指数
1
解决办法
1421
查看次数