Я использую следующий код для обнаружения ярко освещенной лампы. Освещенность может отличаться. Я использую следующий код, чтобы обнаружить то же самое.
img = cv2.imread("input_img.jpg")
rgb = img.copy()
img_grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
while True:
th3 = cv2.adaptiveThreshold(img_grey, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, \
cv2.THRESH_BINARY, 11, 2)
cv2.imshow("th3",th3)
edged = cv2.Canny(th3, 50, 100)
edged = cv2.dilate(edged, None, iterations=1)
edged = cv2.erode(edged, None, iterations=1)
cv2.imshow("edge", edged)
cnts = cv2.findContours(edged.copy(), cv2.RETR_TREE,
cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
areaArray = []
for i, c in enumerate(cnts):
area = cv2.contourArea(c)
areaArray.append(area)
sorteddata = sorted(zip(areaArray, cnts), key=lambda x: x[0], reverse=True)
thirdlargestcontour = sorteddata[2][1]
x, y, w, h = cv2.boundingRect(thirdlargestcontour)
cv2.drawContours(rgb, thirdlargestcontour, -1, (255, 0, 0), 2)
cv2.rectangle(rgb, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imshow("rgb", rgb)
if cv2.waitKey(1) == 27:
break
Приведенный выше код работает, но,
- Он дает только прямоугольник, который охватывает лампу. Как точно определить четыре угловые точки лампы?
- Как улучшить обнаружение? в данный момент я выбираю третий по величине контур, который не гарантирует, что он всегда будет лампой, когда окружающая среда создает проблемы?

ApproxPolydp работает, когда контур завершен, но если контур неполный, ApproxPolydp не возвращает правильную координату. Например, на следующем рисунке апполпидп возвращает неправильные координаты.
