1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > python图像检测_如何用Python检测图像中的矩形项

python图像检测_如何用Python检测图像中的矩形项

时间:2024-05-15 11:18:58

相关推荐

python图像检测_如何用Python检测图像中的矩形项

我发现了很多关于使用openCV等人在图像中找到“东西”的问题.在

Python中,但到目前为止,我一直无法将它们拼凑在一起,以便为我的问题提供可靠的解决方案.

我正在尝试使用计算机视觉来帮助计算微小的表面贴装电子部件.我的想法是将零件转移到一张纯色纸上,拍下一张照片,并让软件告诉我其中有多少件物品.

“事物”从一张图片到另一张图片不同,但在任何一张图片中总是相同的.我似乎能够手动调整特定部件的色调/饱和度等参数,但每次更换新部件时都需要调整.

我目前的半功能代码发布如下:

import imutils

import numpy

import cv2

import sys

def part_area(contours, round=10):

"""Finds the mode of the contour area. The idea is that most of the parts in an image will be separated and that

finding the most common area in the list of areas should provide a reasonable value to approximate by. The areas

are rounded to the nearest multiple of 200 to reduce the list of options."""

# Start with a list of all of the areas for the provided contours.

areas = [cv2.contourArea(contour) for contour in contours]

# Determine a threshold for the minimum amount of area as 1% of the overall range.

threshold = (max(areas) - min(areas)) / 100

# Trim the list of areas down to only those that exceed the threshold.

thresholded = [area for area in areas if area > threshold]

# Round the areas to the nearest value set by the round argument.

rounded = [int((area + (round / 2)) / round) * round for area in thresholded]

# Remove any areas that rounded down to zero.

cleaned = [area for area in rounded if area != 0]

# Count the areas with the same values.

counts = {}

for area in cleaned:

if area not in counts:

counts[area] = 0

counts[area] += 1

# Reduce the areas down to only those that are in groups of three or more with the same area.

above = []

for area, count in counts.iteritems():

if count > 2:

for _ in range(count):

above.append(area)

# Take the mean of the areas as the average part size.

average = sum(above) / len(above)

return average

def find_hue_mode(hsv):

"""Given an HSV image as an input, compute the mode of the list of hue values to find the most common hue in the

image. This is used to determine the center for the background color filter."""

pixels = {}

for row in hsv:

for pixel in row:

hue = pixel[0]

if hue not in pixels:

pixels[hue] = 0

pixels[hue] += 1

counts = sorted(pixels.keys(), key=lambda key: pixels[key], reverse=True)

return counts[0]

if __name__ == "__main__":

# load the image and resize it to a smaller factor so that the shapes can be approximated better

image = cv2.imread(sys.argv[1])

# define range of blue color in HSV

hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

center = find_hue_mode(hsv)

print 'Center Hue:', center

lower = numpy.array([center - 10, 50, 50])

upper = numpy.array([center + 10, 255, 255])

# Threshold the HSV image to get only blue colors

mask = cv2.inRange(hsv, lower, upper)

inverted = cv2.bitwise_not(mask)

blurred = cv2.GaussianBlur(inverted, (5, 5), 0)

edged = cv2.Canny(blurred, 50, 100)

dilated = cv2.dilate(edged, None, iterations=1)

eroded = cv2.erode(dilated, None, iterations=1)

# find contours in the thresholded image and initialize the shape detector

contours = cv2.findContours(eroded.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

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

# Compute the area for a single part to use when setting the threshold and calculating the number of parts within

# a contour area.

part_area = part_area(contours)

# The threshold for a part's area - can't be too much smaller than the part itself.

threshold = part_area * 0.5

part_count = 0

for contour in contours:

if cv2.contourArea(contour) < threshold:

continue

# Sometimes parts are close enough together that they become one in the image. To battle this, the total area

# of the contour is divided by the area of a part (derived earlier).

part_count += int((cv2.contourArea(contour) / part_area) + 0.1) # this 0.1 "rounds up" slightly and was determined empirically

# Draw an approximate contour around each detected part to give the user an idea of what the tool has computed.

epsilon = 0.1 * cv2.arcLength(contour, True)

approx = cv2.approxPolyDP(contour, epsilon, True)

cv2.drawContours(image, [approx], -1, (0, 255, 0), 2)

# Print the part count and show off the processed image.

print 'Part Count:', part_count

cv2.imshow("Image", image)

cv2.waitKey(0)

这是我正在使用的输入图像类型的示例:

或这个:

我目前正在得到这样的结果:

结果清楚地表明,剧本在识别某些部件时遇到了麻烦,而且当部件彼此接触时,其真正的跟腱似乎就是这样.

所以我的问题/挑战是,我该怎么做才能提高这个脚本的可靠性?

该脚本将集成到现有的Python工具中,因此我正在使用Python搜索解决方案.解决方案不需要是纯Python,因为我愿意安装可能需要的第三方库.

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。