python - OpenCV TypeError : contour is not a numpy array, 既不是标量

标签 python opencv numpy contour

我正在尝试使用 OpenCV 从 Nike 图像中提取标签。这是一个教程代码,取自:

http://opencv-code.com/tutorials/ocr-ing-nikes-new-rsvp-program/

虽然我修改了几行代码,但那部分没有错误(不确定它是否有效,因为我还没有能够成功地完全运行它。)

当我运行命令“python a.py”时。显示此错误:-

Traceback (most recent call last):
  File "a.py", line 42, in <module>
    otcnt = [c for c in cnt if cv2.contourArea(c) < 100]
TypeError: contour is not a numpy array, neither a scalar

a.py:-

#!/usr/bin/env python
import numpy as np
import cv2
import cv2.cv as cv

def do_ocr(img0):
  pass

if __name__ == "__main__":
  img0 = cv2.imread('nike-1.jpg')
  if img0 == None:
    import sys
    sys.exit()
  do_ocr(img0)
img1 = cv2.cvtColor(img0, cv2.COLOR_BGR2GRAY)
img2 = cv2.adaptiveThreshold(img1, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 45, 0)
size = np.size(img2)
skel = np.zeros(img2.shape,np.uint8)

ret,img2 = cv2.threshold(img2,127,255,0)
element = cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3))
done = False 
while( not done):
    eroded = cv2.erode(img2,element)
    temp = cv2.dilate(eroded,element)
    temp = cv2.subtract(img2,temp)
    skel = cv2.bitwise_or(skel,temp)
    img2 = eroded.copy()

    zeros = size - cv2.countNonZero(img2)
    if zeros==size:
        done = True
img3 = img2
img4 = cv2.copyMakeBorder(img3, 1, 1, 1, 1, cv2.BORDER_CONSTANT, value=0)
cv2.floodFill(img4, None, (0,0), 255)
img5 = cv2.erode(255-img4, np.ones((3,3), np.uint8), iterations=2)
cnt = cv2.findContours(img5, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[0]
cnt = [c for c in cnt if cv2.contourArea(c) > 5000]
mask = np.zeros(img0.shape[:2], np.uint8)
cv2.drawContours(mask, cnt, -1, 255, -1)
dst = img2 & mask
cnt = cv2.findContours(dst.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
otcnt = [c for c in cnt if cv2.contourArea(c) < 100]
cv2.drawContours(dst, otcnt, -1, 0, -1)
api = tesseract.TessBaseAPI()
api.Init(".", "eng", tesseract.OEM_DEFAULT)
api.SetVariable("tessedit_char_whitelist", "#ABCDEFGHIJKLMNOPQRSTUVWXYZ")
api.SetPageSegMode(tesseract.PSM_SINGLE_LINE)

image = cv.CreateImageHeader(dst.shape[:2], cv.IPL_DEPTH_8U, 1)
cv.SetData(image, dst.tostring(), dst.dtype.itemsize * dst.shape[1])
tesseract.SetCvImage(image, api)
print api.GetUTF8Text().string()

我对 Python 编程(和 Python 语法)还很陌生,无论如何我都必须用 Python 来完成。如果您可以发布它的完整正确版本或指出哪一行代码应该替换为哪一行,我将非常感谢您。

谢谢

附注我在 stackoverflow 上的第一个问题,如果没有遵循任何惯例,我深表歉意。

最佳答案

这个运行时错误是因为当你在第 42 行重新定义 cnt

cnt = cv2.findContours(dst.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

你设置的是cv2.findContours的两个返回值的元组。查看您之前对第 37 行中函数的调用作为指南。您需要做的就是将第 42 行更改为

cnt = cv2.findContours(dst.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[0]

您的下一个问题是您尚未导入 tesseract

关于python - OpenCV TypeError : contour is not a numpy array, 既不是标量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17628627/

相关文章:

python - python 脚本完成后清除所有 c++ 对象

python - Python脚本youtube-dl返回一个新文件

python - 在 pandas 数据框中获取 IndexError

c++ - 将图像颜色从灰度转换为 RGB OpenCV C++

python - 将不同长度的列表列表转换为 numpy 数组

python - 短时傅里叶变换和逆变换数据丢失: Need Help Improving Audio Quality

python函数计算成绩

使用 Python OpenCV 进行图像重复模式检测

java - 从一个 Mat 复制到另一个 Mat 只有近乎黑色的像素

python - 使用 Numpy 在空数组中插入行