小编Abi*_*n K的帖子

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万
查看次数

如何消除数独广场中的凸性缺陷?

我正在做一个有趣的项目:使用OpenCV从输入图像中解决数独(如Google护目镜等).我完成了任务,但最后我发现了一个问题,我来到这里.

我使用OpenCV 2.3.1的Python API进行编程.

以下是我的所作所为:

  1. 阅读图片
  2. 找到轮廓
  3. 选择具有最大面积的那个(并且也有点等于正方形).
  4. 找到角点.

    例如,如下:

    在此输入图像描述

    (请注意,绿线正确地与Sudoku的真实边界重合,因此可以正确扭曲数独.查看下一张图片)

  5. 将图像扭曲成完美的正方形

    例如:

    在此输入图像描述

  6. 执行OCR(我使用我在OpenCV-Python中的简单数字识别OCR中给出的方法)

而且方法效果很好.

问题:

看看这个图像.

在此图像上执行第4步,结果如下:

在此输入图像描述

绘制的红线是原始轮廓,它是数独边界的真实轮廓.

绘制的绿线是近似轮廓,它将是扭曲图像的轮廓.

当然,在数独的上边缘绿线和红线之间存在差异.因此,在翘曲时,我没有得到数独的原始边界.

我的问题 :

如何在数独的正确边界上扭曲图像,即红线,或者如何消除红线和绿线之间的差异?在OpenCV中有没有这方法?

python opencv sudoku computer-vision

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

在较大的图像python OpenCv上覆盖较小的图像

嗨,我正在创建一个程序,用其他人的脸取代图像中的脸部.但是,我一直试图将新面孔插入原始的较大图像中.我已经研究了ROI和addWeight(需要图像大小相同),但我还没有找到一种方法在python中做到这一点.任何建议都很棒.我是opencv的新手.

我使用以下测试图像:

smaller_image:

在此输入图像描述

larger_image:

在此输入图像描述

这是我的代码到目前为止...其他样本的混合器:

import cv2
import cv2.cv as cv
import sys
import numpy

def detect(img, cascade):
    rects = cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=3, minSize=(10, 10), flags = cv.CV_HAAR_SCALE_IMAGE)
    if len(rects) == 0:
        return []
    rects[:,2:] += rects[:,:2]
    return rects

def draw_rects(img, rects, color):
    for x1, y1, x2, y2 in rects:
        cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)

if __name__ == '__main__':
    if len(sys.argv) != 2:                                         ## Check for error in usage syntax

    print "Usage : python faces.py <image_file>"

else:
    img …
Run Code Online (Sandbox Code Playgroud)

python opencv object-detection

42
推荐指数
5
解决办法
7万
查看次数

OpenCV-Python接口,cv和cv2的性能比较

几天前,我开始使用新的OpenCV-Python界面cv2.

我的问题是关于比较cvcv2界面.

关于易用性,新cv2界面的改进程度要大得多,而且使用起来非常简单有趣cv2.

但速度怎么样?

我制作了两个小码密码,一个在cv另一个cv2,用于检查性能.两者都具有相同的功能,访问图像的像素,测试它,进行一些修改等.

以下是代码:


cv2 interface:

import time
import numpy as np
import cv2

gray = cv2.imread('sir.jpg',0)
width = gray.shape[0]
height = gray.shape[1]
h = np.empty([width,height,3])
t = time.time()
for i in xrange(width):
    for j in xrange(height):
        if gray[i,j]==127:
            h[i,j]=[255,255,255]
        elif gray[i,j]>127:
            h[i,j]=[0,0,255-gray[i,j]]
        else:
            h[i,j]=[gray[i,j],0,0]
t2 = time.time()-t
print "time taken = ",t2
Run Code Online (Sandbox Code Playgroud)

================================================== ===

结果是:

所用时间= 14.4029130936

================================================== ====

cv界面:

import cv,time …
Run Code Online (Sandbox Code Playgroud)

python performance opencv computer-vision

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

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万
查看次数

在Python中解决难题

我有一个谜题,我想用Python解决它.

难题:

一个商人的重量为40公斤,他在他的店里使用.有一次,它从他的手上掉下来,分成4块.但令人惊讶的是,现在他可以通过这4件的组合称重1公斤到40公斤之间的任何重量.

所以问题是,这4件的重量是多少?

现在我想用Python解决这个问题.

我从拼图中得到的唯一约束是4个总和是40.我可以过滤掉总和为40的所有4个值的集合.

import itertools as it

weight = 40
full = range(1,41)
comb = [x for x in it.combinations(full,4) if sum(x)==40]
Run Code Online (Sandbox Code Playgroud)

length of comb = 297

现在我需要检查每组值comb并尝试所有操作组合.

例如,如果(a,b,c,d)是第一组值comb,我需要检查a,b,c,d,a+b,a-b, .................a+b+c-d,a-b+c+d........,依此类推.

我尝试了很多,但我陷入了这个阶段,即如何检查所有这些计算组合到每组4个值.

题 :

1)我想我需要列出所有可能的组合[a,b,c,d] and [+,-].

2)有没有人有更好的想法,告诉我如何从这里前进?

另外,我想完全没有任何外部库的帮助,只需要使用python的标准库.

编辑:对不起,迟到的信息.答案是(1,3,9,27),这是我几年前发现的.我检查并验证了答案.

编辑:目前,fraxel答案是完美的time = 0.16 ms.总是欢迎更好,更快的方法.

问候

方舟

python puzzle combinations permutation python-itertools

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

在OpenCV-Python中绘制直方图

我只是试图使用新的OpenCV Python接口(cv2)绘制直方图.

以下是我试过的代码:

import cv2
import numpy as np
import time

img = cv2.imread('zzz.jpg')
h = np.zeros((300,256,3))
b,g,r = cv2.split(img)
bins = np.arange(256).reshape(256,1)
color = [ (255,0,0),(0,255,0),(0,0,255) ]

for item,col in zip([b,g,r],color):
    hist_item = cv2.calcHist([item],[0],None,[256],[0,255])
    cv2.normalize(hist_item,hist_item,0,255,cv2.NORM_MINMAX)
    hist=np.int32(np.around(hist_item))
    pts = np.column_stack((bins,hist))
    cv2.polylines(h,[pts],False,col)

h=np.flipud(h)

cv2.imshow('colorhist',h)
cv2.waitKey(0)
Run Code Online (Sandbox Code Playgroud)

它工作正常.以下是我获得的结果直方图.

在此输入图像描述


然后我修改了一点代码.

b,g,r = cv2.split(img)即将代码中的第六行更改为b,g,r = img[:,:,0], img[:,:,1], img[:,:,2](因为它的工作速度稍快cv2.split).

现在输出是不同的.以下是输出.

在此输入图像描述


我检查了b,g,r两个代码的值.他们是一样的.

差异在于产量cv2.calcHist.hist_item两种情况的结果都不同.

问题:

怎么会发生?cv2.calcHist当输入相同时,为什么结果不同?

编辑

我尝试了不同的代码.现在,我的第一个代码的numpy版本.

import cv2
import numpy as np …
Run Code Online (Sandbox Code Playgroud)

python opencv numpy histogram computer-vision

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

如何在PyQt中实现一个简单的按钮

我想在PyQt中实现一个简单的按钮,在单击时打印"Hello world".我怎样才能做到这一点?

我是PyQt的真正新手.

python pyqt button signals-slots pyqt4

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

寻找图像中的凹坑

我的一位朋友正在研究以下项目:

下面是不锈钢表面的微观(SEM)图像.

在此输入图像描述

但你可以看到,它被腐蚀了一点(长时间暴露在海洋环境中)并且在表面形成了一些凹坑.一些坑被标记为红色圆圈.

他需要在图像中找到凹坑数量并且他手动计算它(想象一下,有近150张图像).所以我想到用任何图像处理工具自动化这个过程.

题:

如何在此图像中找到凹坑数?


我尝试了什么:

作为第一步,我通过关闭操作稍微改善了对比度.

import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('6.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(11,11))

close = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, kernel)

close2 = cv2.add(close,1)
div = (np.float32(gray)+1)/(close2)
div2 = cv2.normalize(div,None, 0,255, cv2.NORM_MINMAX)
div3 = np.uint8(div2)
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述

然后我为127应用了一些阈值并在其中找到轮廓.之后这些轮廓根据它们的面积进行过滤(没有关于该区域的具体信息,我将1-10的范围作为经验值).

ret, thresh = cv2.threshold(div3, 127,255, cv2.THRESH_BINARY_INV)
temp, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)

res = np.zeros(gray.shape,np.uint8)

for cnt in contours:
    if 1.0 < cv2.contourArea(cnt) < 10.0:
        res = cv2.drawContours(res, …
Run Code Online (Sandbox Code Playgroud)

matlab opencv image-processing computer-vision scikit-image

10
推荐指数
1
解决办法
446
查看次数

非恢复除法算法

有没有人知道使用非恢复除法划分无符号二进制整数的步骤?

很难在网上找到任何好的消息来源.

即如果A = 101110B = 010111

我们如何A divided by B在非恢复部门找到?寄存器在每一步中都是什么样的?

谢谢!

algorithm binary bits division addition

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