日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

發(fā)布時間:2024/10/6 python 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python图像检测_如何用Python检测图像中的矩形项 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我發(fā)現(xiàn)了很多關于使用openCV等人在圖像中找到“東西”的問題.在

Python中,但到目前為止,我一直無法將它們拼湊在一起,以便為我的問題提供可靠的解決方案.

我正在嘗試使用計算機視覺來幫助計算微小的表面貼裝電子部件.我的想法是將零件轉移到一張純色紙上,拍下一張照片,并讓軟件告訴我其中有多少件物品.

“事物”從一張圖片到另一張圖片不同,但在任何一張圖片中總是相同的.我似乎能夠手動調整特定部件的色調/飽和度等參數(shù),但每次更換新部件時都需要調整.

我目前的半功能代碼發(fā)布如下:

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)

這是我正在使用的輸入圖像類型的示例:

或這個:

我目前正在得到這樣的結果:

結果清楚地表明,劇本在識別某些部件時遇到了麻煩,而且當部件彼此接觸時,其真正的跟腱似乎就是這樣.

所以我的問題/挑戰(zhàn)是,我該怎么做才能提高這個腳本的可靠性?

該腳本將集成到現(xiàn)有的Python工具中,因此我正在使用Python搜索解決方案.解決方案不需要是純Python,因為我愿意安裝可能需要的第三方庫.

總結

以上是生活随笔為你收集整理的python图像检测_如何用Python检测图像中的矩形项的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。