gpt4 book ai didi

python - OpenCV python canny 所需参数 'threshold2' (pos 4) 未找到

转载 作者:太空宇宙 更新时间:2023-11-03 14:50:07 24 4
gpt4 key购买 nike

在将文本发送到 tesseract4 引擎以最大化结果之前,我尝试使用 openCV 从图像中分离出文本。

我找到了这个 interesting post我决定复制源代码并通过 mysdelf 尝试

但是我遇到了关于 first call to OpenCV 的问题

重现:

  1. 简单地从要点中复制代码

  2. 启动命令script.py/path/to/image.jpg

我遇到问题:未找到必需的参数“threshold2”(位置 4)

您可能知道这意味着什么。我是 javascript、java 和 bash 脚本开发人员,但不是 python...

在一个简单的版本中:

import glob
import os
import random
import sys
import random
import math
import json
from collections import defaultdict

import cv2
from PIL import Image, ImageDraw
import numpy as np
from scipy.ndimage.filters import rank_filter

if __name__ == '__main__':
if len(sys.argv) == 2 and '*' in sys.argv[1]:
files = glob.glob(sys.argv[1])
random.shuffle(files)
else:
files = sys.argv[1:]

for path in files:
out_path = path.replace('.jpg', '.crop.png')
if os.path.exists(out_path): continue
orig_im = Image.open(path)
edges = cv2.Canny(np.asarray(orig_im), 100, 200)

预先感谢您的帮助

最佳答案

编辑:好吧,这个答案显然是错误的,因为我试图将我自己的 16 位 int 图像发送到函数中,但无法重现结果。

Edit2:所以我可以使用以下方法重现错误:

from PIL import Image
import numpy as np
import cv2

orig_im = Image.open('opencv-logo2.png')

threshold1 = 50
threshold2 = 150
edges = cv2.Canny(orig_im, 50, 100)

TypeError: Required argument 'threshold2' (pos 4) not found

因此,如果图像没有转换为数组,即传入了 Image 类,我就会得到错误。 PIL Image 类是一个除了关联图像数据之外还有很多东西的类,因此必须转换为 np.array 才能传递给函数。但如果转换得当,一切都会顺利进行。

在与 Dan Mašek 的聊天中,我下面的想法有点不正确。确实,较新的 Canny() 方法需要 16 位图像,但绑定(bind)不会查看实际的 numpy dtype 以查看它的位深度决定使用哪个函数调用。另外,如果您尝试实际发送一个 uint16 图像,您会得到一个不同的错误:

edges = cv2.Canny(np.array([[0, 1234], [1234, 2345]], dtype=np.uint16), 50, 100)

error: (-215) depth == CV_8U in function Canny

所以我最初给出的答案(如下)并不是罪魁祸首。也许您不小心删除了 orig_imnp.array() 转换并得到了那个错误,或者,其他奇怪的事情正在发生。


原始(错误)答案

在 OpenCV 3.2.0 中,引入了 Canny() 的新方法,允许用户指定自己的渐变图像。在最初的实现中,Canny() 将使用 Sobel() 运算符来计算梯度,但现在您可以计算 Scharr() 衍生物并将那些传递给Canny()。所以这很酷。但这与您的问题有什么关系?

Canny() 方法被重载。它会根据您发送的参数决定您要使用哪个函数。带有所需参数的 Canny() 的原始调用看起来像

cv2.Canny(image, threshold1, threshold2)

但是新的重载方法看起来像

cv2.Canny(grad_x, grad_y, threshold1, threshold2)

现在,您的错误消息中有一个提示:

Required argument 'threshold2' (pos 4) not found

这些调用中的哪一个在位置 4 中有 threshold2?更新的方法调用!那么,如果您只传递了三个参数,为什么要调用它呢?请注意,如果您使用 PIL 图像,则会出现错误,但如果您使用 numpy 图像,则不会。那么还有什么让它假设您正在使用新电话呢?

如果您检查 OpenCV 3.3.0 Canny() docs ,您会看到原始的 Canny() 调用需要一个 8 位输入图像 作为第一个位置参数,而新的 Canny() 调用需要输入图像的 16 位 x 导数(CV_16SC1 或 CV_16SC3) 作为第一个位置参数。

将两个和两个放在一起,PIL 为您提供 16 位输入图像,因此 OpenCV 认为您正在尝试调用新方法。

因此,如果您想继续使用 PIL,这里的解决方案是将您的图像转换为 8 位表示。 Canny() 需要一个单 channel (即灰度)图像来运行,首先关闭。因此,您需要首先确保 image 是单 channel 的,然后对其进行缩放并更改 numpy dtype。我相信 PIL 会将灰度图像读取为单 channel (默认情况下,OpenCV 将所有图像读取为三 channel ,除非您另有说明)。

如果图像是 16 位的,那么使用 numpy 可以很容易地转换:

img = (img/256).astype('uint8')

这假设 img 是一个 numpy 数组,因此您需要先使用 np.array() 将 PIL 图像转换为 ndarraynp.asarray()

然后您应该能够使用原始函数调用运行 Canny()

关于python - OpenCV python canny 所需参数 'threshold2' (pos 4) 未找到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46466257/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com