gpt4 book ai didi

python - OpenCV 断言失败 : (-215:Assertion failed) npoints >= 0 && (depth == CV_32F || depth == CV_32S)

转载 作者:太空宇宙 更新时间:2023-11-03 12:43:33 27 4
gpt4 key购买 nike

我在 this website 上找到了以下代码:

import os
import os.path
import cv2
import glob
import imutils
CAPTCHA_IMAGE_FOLDER = "generated_captcha_images"
OUTPUT_FOLDER = "extracted_letter_images"


# Get a list of all the captcha images we need to process
captcha_image_files = glob.glob(os.path.join(CAPTCHA_IMAGE_FOLDER, "*"))
counts = {}

# loop over the image paths
for (i, captcha_image_file) in enumerate(captcha_image_files):
print("[INFO] processing image {}/{}".format(i + 1, len(captcha_image_files)))

# Since the filename contains the captcha text (i.e. "2A2X.png" has the text "2A2X"),
# grab the base filename as the text
filename = os.path.basename(captcha_image_file)
captcha_correct_text = os.path.splitext(filename)[0]

# Load the image and convert it to grayscale
image = cv2.imread(captcha_image_file)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Add some extra padding around the image
gray = cv2.copyMakeBorder(gray, 8, 8, 8, 8, cv2.BORDER_REPLICATE)

# threshold the image (convert it to pure black and white)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]

# find the contours (continuous blobs of pixels) the image
contours = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# Hack for compatibility with different OpenCV versions
contours = contours[0] if imutils.is_cv2() else contours[1]

letter_image_regions = []

# Now we can loop through each of the four contours and extract the letter
# inside of each one
for contour in contours:
# Get the rectangle that contains the contour
(x, y, w, h) = cv2.boundingRect(contour)

# Compare the width and height of the contour to detect letters that
# are conjoined into one chunk
if w / h > 1.25:
# This contour is too wide to be a single letter!
# Split it in half into two letter regions!
half_width = int(w / 2)
letter_image_regions.append((x, y, half_width, h))
letter_image_regions.append((x + half_width, y, half_width, h))
else:
# This is a normal letter by itself
letter_image_regions.append((x, y, w, h))

# If we found more or less than 4 letters in the captcha, our letter extraction
# didn't work correcly. Skip the image instead of saving bad training data!
if len(letter_image_regions) != 4:
continue

# Sort the detected letter images based on the x coordinate to make sure
# we are processing them from left-to-right so we match the right image
# with the right letter
letter_image_regions = sorted(letter_image_regions, key=lambda x: x[0])

# Save out each letter as a single image
for letter_bounding_box, letter_text in zip(letter_image_regions, captcha_correct_text):
# Grab the coordinates of the letter in the image
x, y, w, h = letter_bounding_box

# Extract the letter from the original image with a 2-pixel margin around the edge
letter_image = gray[y - 2:y + h + 2, x - 2:x + w + 2]

# Get the folder to save the image in
save_path = os.path.join(OUTPUT_FOLDER, letter_text)

# if the output directory does not exist, create it
if not os.path.exists(save_path):
os.makedirs(save_path)

# write the letter image to a file
count = counts.get(letter_text, 1)
p = os.path.join(save_path, "{}.png".format(str(count).zfill(6)))
cv2.imwrite(p, letter_image)

# increment the count for the current key
counts[letter_text] = count + 1

当我尝试运行代码时出现以下错误:

[INFO] processing image 1/9955
Traceback (most recent call last):
File "extract_single_letters_from_captchas.py", line 47, in <module>
(x, y, w, h) = cv2.boundingRect(contour)
cv2.error: OpenCV(4.0.0) /Users/travis/build/skvark/opencv-python/opencv/modules/imgproc/src/shapedescr.cpp:741: error: (-215:Assertion failed) npoints >= 0 && (depth == CV_32F || depth == CV_32S) in function 'pointSetBoundingRect'

我尝试在 StackOverflow 上搜索解决方案,但没有找到任何类似的解决方案。


编辑(见评论):

  • type(contour[0]) = <class 'numpy.ndarray'>

  • len(contour) = 4

最佳答案

这是错误的做法:

contours = contours[0] if imutils.is_cv2() else contours[1]

imutils.is_cv2() 返回 False,即使它应该返回 True。如果您不介意删除此依赖项,请更改为:

contours = contours[0]

我找到了原因。您正在学习的教程可能是在 OpenCV 4 发布之前发布的。 OpenCV 3 已更改 cv2.findContours(...)返回 image, contours, hierarchy,而 OpenCV 2's cv2.findContours(...)OpenCV 4's cv2.findContours(...)返回 contours, hierarchy。因此,在 OpenCV 4 之前,如果您使用 OpenCV 2,它应该是 contours[0] else contours[1] 是正确的。如果你还想有这种“兼容”,可以改成:

contours = contours[1] if imutils.is_cv3() else contours[0]

关于python - OpenCV 断言失败 : (-215:Assertion failed) npoints >= 0 && (depth == CV_32F || depth == CV_32S),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54734538/

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