gpt4 book ai didi

python - OpenCV 背景减除以改进检测

转载 作者:太空宇宙 更新时间:2023-11-03 22:19:57 30 4
gpt4 key购买 nike

我能够检测到传送带上的鸡蛋,但问题是,如果传送带上没有鸡蛋,算法仍会找到对象。

检测到传送带上的鸡蛋:

enter image description here enter image description here

如果传送带上没有鸡蛋:

enter image description here enter image description here

为了减少错误检测,我正在检查半径和面积:

if (radius < 100 and radius > 20):
....
if area > 2200 and area < 8800:
....

但是这些检查点不足以防止错误检测。

我已尝试使用 createBackgroundSubtractorMOG 方法,但在减法后未能检测到鸡蛋。

传送带类型可能会有所不同。

从图像中去除静态背景(带)的最佳方法是什么?

代码:

    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
th, bw = cv2.threshold(hsv[:, :, 2], 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
morph = cv2.morphologyEx(bw, cv2.MORPH_CLOSE, kernel)
dist = cv2.distanceTransform(morph, cv2.DIST_L2, cv2.DIST_MASK_PRECISE)

borderSize = 75
distborder = cv2.copyMakeBorder(dist, borderSize, borderSize, borderSize, borderSize,
cv2.BORDER_CONSTANT | cv2.BORDER_ISOLATED, 0)
gap = 10
kernel2 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (2*(borderSize-gap)+1, 2*(borderSize-gap)+1))
kernel2 = cv2.copyMakeBorder(kernel2, gap, gap, gap, gap,
cv2.BORDER_CONSTANT | cv2.BORDER_ISOLATED, 0)

distTempl = cv2.distanceTransform(kernel2, cv2.DIST_L2, cv2.DIST_MASK_PRECISE)

nxcor = cv2.matchTemplate(distborder, distTempl, cv2.TM_CCOEFF_NORMED)

mn, mx, _, _ = cv2.minMaxLoc(nxcor)
th, peaks = cv2.threshold(nxcor, mx*0.5, 255, cv2.THRESH_BINARY)
peaks8u = cv2.convertScaleAbs(peaks)

#fgmask = self.fgbg.apply(peaks8u)

_,contours, hierarchy = cv2.findContours(peaks8u, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
peaks8u = cv2.convertScaleAbs(peaks) # to use as mask

for cnt in contours:
try:
if len(cnt) >= 5:
(x, y), radius = cv2.minEnclosingCircle(cnt)
radius = int(radius)
#print("radius: ", radius)
if (radius < 100 and radius > 20):
ellipse = cv2.fitEllipse(cnt)
(center , axis, angle) = ellipse
cx,cy = int(center[0]),int(center[1])
ax1,ax2 = int(axis[0])-2,int(axis[1])-2
orientation = int(angle)
area = cv2.contourArea(cnt)
if area > 2200 and area < 8800:
cv2.ellipse(frame, (cx,cy), (ax1,ax2), orientation, 0, 360, (255,0,0), 2)
#cv2.circle(frame, (cx,cy), 1, (0, 255, 0), 15)
cv2.putText(frame,str(int(area)),(cx,cy), cv2.FONT_HERSHEY_SIMPLEX, 0.5, 0, 1, cv2.LINE_AA)

最佳答案

获取背景图片有两个基本选项:

  1. 在某些设置/校准过程中提前获取特定传送带的背景图像。
  2. 使用数据本身推导背景,为此您必须移除对象(鸡蛋)。

第二个选项可以通过随时间取每个像素的平均值或中值来实现。鉴于大多数时候每个像素都显示背景,您将对没有物体的场景有一个相当好的估计。

关于python - OpenCV 背景减除以改进检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51421007/

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