- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在将文本发送到 tesseract4 引擎以最大化结果之前,我尝试使用 openCV 从图像中分离出文本。
我找到了这个 interesting post我决定复制源代码并通过 mysdelf 尝试
但是我遇到了关于 first call to OpenCV 的问题
重现:
简单地从要点中复制代码
启动命令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_im
的 np.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 图像转换为 ndarray
或 np.asarray()
。
然后您应该能够使用原始函数调用运行 Canny()
。
关于python - OpenCV python canny 所需参数 'threshold2' (pos 4) 未找到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46466257/
任何人都可以帮助我理解 Jmeter 仪表板报告中的术语“容忍阈值”和“挫折阈值” enter image description here 最佳答案 APDEX 说明 here 要计算它,JMete
当display-buffer必须在现有 Pane 中创建一个新窗口,Emacs manual声明 split-height-threshold首先查看新窗口是否可以低于当前窗口,然后 split-w
我收到以下错误消息: Error in "if (reached.threshold < min.reached.threshold) {" : missing value wher
我收到以下错误消息: Error in "if (reached.threshold < min.reached.threshold) {" : missing value wher
我试图解释 yolov3.cfg 文件中不同参数的用途,但是,我找不到关于 ignore_thresh 和 truth_thresh 的任何解释。 我目前(有限的)理解是,它们要么与作为组合边界框的阈
我怎样才能有一个类似于 SQL“...WHERE _id > threshold”的 mongo 查询 我尝试了以下方法,但没有任何结果。 db.things.find(_id: {$gt: som
建立分类模型后,我通过准确率、精确率和召回率对其进行评估。为了检查过度拟合,我使用了 K Fold Cross Validation。我知道,如果我的模型分数与交叉验证分数相差很大,那么我的模型就过度
在下面的代码中,我有一个 8 位整数的 numpy 数组。我想对它们应用一个阈值,所以我调用 cv2.threshold(img,128,1,cv2.THRSH_TOZERO)[1] .文档表明该函数
所以基本上我今天需要优化这段代码。它试图找到某个函数为前百万个起始数字生成的最长序列: public static void main(String[] args) { int mostLen
谁能告诉我这些自适应阈值函数中的参数是什么以及它们如何控制黑白像素。 cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,\
我正在尝试了解 GC 的工作原理并且一直在阅读 https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.h
我有一个深度 CNN,可以很好地进行多类分类。我想“升级”挑战并针对多标签分类问题对其进行训练。 为此,我用 sigmoid 替换了 softmax,并尝试训练我的网络以最小化: tf.reduce_
我有一个 DataFrame,如下所示: 我想使用 GroupBy 方法来返回行,例如: "'gain_by_mae' > 1 的所有行", "'entry_time' > 8:00 和 'entry
我运行这段代码: import cv2 import numpy as np from matplotlib import pyplot as plt im=cv2.imread('1.jpg') #
我正在测试 cv2.threshold()使用不同的值运行,但我每次都会得到意想不到的结果。所以这意味着我根本不明白 parameter 的效果: 最大 有人可以解决这个问题吗? 比如我想按照白色绘制
我是 Python 新手。 我想借助傅立叶变换定义文本旋转。 import cv2 import numpy as np import matplotlib.pyplot as plot img =
我有一个 DataFrame,我希望在其上使用 groupby,但我正在寻找一些不寻常的函数来进行聚合。我想让每个组中的观察百分比超过某个阈值。例如,阈值为 0 时,DataFrame df = pd
我是 Grafana World 的新手。我需要和你们澄清两件事: 1)无论如何要在时间范围内动态更改阈值? 2)Grafana 如何计算平均值?有没有办法通过使用 lucene 将总计数除以常量变量
在设置 ELB 健康检查的对话框中指出: If an instance fails the health check, it is automatically removed from the loa
Closed. This question is off-topic。它当前不接受答案。
我是一名优秀的程序员,十分优秀!