- 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/
我有一个脚本,该脚本用于根据颜色相似性为房间的墙壁重新着色。但是我需要根据边缘检测为墙壁重新着色。 import cv2 import numpy as np import sys from PIL
我想尝试 Canny 边缘检测器,但是当我尝试开始时收到未处理的异常: canny_project.exe 中 0x00007FF97F6C8B9C 处未处理的异常:Microsoft C++ 异常:
我想从二进制 canny 边缘图像中提取轮廓。 原图为: 应用 cvCanny() 和 cvDilate() 后,我得到以下图像: 我需要将封闭框(整个蓝色框)检测为轮廓。我应用 cvFindCont
我在 OpenCV Java 中使用 Canny 边缘算法找出了边缘。我需要从这张图片中提取脊髓。 能否请您建议下一步如何仅从此图像中提取脊髓? 这是原始图像: 最佳答案 要从图像中提取特定对象,您必
我正在使用 canny 边缘检测器来检测输入图像的边缘。 在每个输入图像中,可以有两个对象(主对象和其中的另一个对象),如示例图像所示。因此,我应该在这种情况下检测两条边 我根据输入图像自动确定阈值上
我使用 OpenCV 的时间相当短,对图像执行了 Canny 边缘检测,然后还执行了膨胀以进一步将对象(在我的例子中是正方形)与背景分开。 我现在的问题是使用一种算法来识别 2D 中的可抓取区域,该算
我有一张图片,我想检测它的边缘。我发现 Canny 已经被使用了很多(我不知道我是否有比这更好的选择)。我已将值设置如下: Imgproc.Canny(img, img, 10, 100, 3,t
我正在尝试寻找图像的轮廓,在此之前我正在应用 Canny 的边缘检测器。它为不同的图像提供不同的结果。对于一张图像,它在阈值下给出完美的轮廓 - min-40 max-240,而对于其他图像,它的阈值
当我使用 canny edge 算法时,它会按预期产生与粗彩色线相对的 2 条边,但我只想显示一条边,以使我的直线和曲线检测算法更简单,关于我怎样才能做到这一点? 代码如下: bool CannyEd
当使用 Imagemagick 转换工具的 -canny 选项时,这些参数指的是什么? -canny radiusxsigma{+lower-percent}{+upper-percent} 文档 (
我正在尝试创建一个程序,该程序将检测并去除图片中的边框,目标是检测图片中的文档并将其清理... 这是我的代码: import sys import cv2 import numpy as np imp
我知道在使用 Canny 检测边缘之前对图像应用高斯模糊非常重要。我的问题是: cv2.Canny() 自己做高斯模糊还是有必要在 cv2.Canny() 之前应用 cv2.GaussianBlur(
当我在图纸上运行 cv.Canny 边缘检测器时,它会检测到数百个密集填充在阴影区域中的小边缘。我怎样才能让它停止这样做,同时仍然检测到眼睛和 Nose 等较轻的特征?我也试过模糊。 这是一个示例,与
我正在尝试在此图像上运行精明边缘检测器: 使用此代码: def edges(img): from skimage import feature img = Image.open(img
我尝试过 OpenCV 中的 cvFindContours 函数,以在 Canny-edge-decctting 后获取单独的边缘。 我的问题是如何自己做与 cvFindcontours 相同的事情。
假设 Canny 边缘检测器成功检测到图像中的边缘。然后将边缘旋转 θ,其中原始边缘上的点 (x,y)(x,y) 与旋转边缘上的点 (x′,y) 之间的关系′)(x′,y′)定义为x′ = xcosθ
我想从 canny edge map 中找到并标记端点。 我试图通过只与一个邻居查看点来自己做,但此时的结果很奇怪。 OpenCV 中有查找端点的函数吗? 来自原始 Canny 的样本: 放大示例:
我正在尝试使用 Canny 过滤器检测图像的边缘。我已经能够检测到图像,但角落不是很尖锐(以红色圆圈突出显示)。令人惊讶的是,与其他角相比,第一个角很锋利并且没有烧坏。为什么会发生这种情况以及如何避免
我有 Canny 检测到的边缘。我想提取边缘的轮廓。 我已经检查了以下帖子。 OpenCV converting Canny edges to contours . 但它没有处理复杂的形状。例如,带矩
是否可以制作Canny忽略短边还是忽略低梯度边?在我的例子中,我将卡片放在木头上,并在 canny 之后看到木结构的许多边缘 canny 函数中的两个阈值有什么用? 最佳答案 Large intens
我是一名优秀的程序员,十分优秀!