Anonymous
Строительные контуры из очков OpenCV
Сообщение
Anonymous » 27 июн 2025, 22:51
Со следующим вводом теста: test.png :
и мой код:
Код: Выделить всё
import cv2
import numpy as np
# import matplotlib.pyplot as plt
import imutils
print("Your OpenCV version: {}".format(cv2.__version__))
print("Are you using OpenCV 2.X? {}".format(imutils.is_cv2()))
print("Are you using OpenCV 3.X? {}".format(imutils.is_cv3()))
print("Are you using OpenCV 4.X? {}".format(imutils.is_cv4()))
image_path = 'test.png'
image = cv2.imread(image_path)
cv2.imshow('input', image)
cv2.waitKey(0)
gray_image = cv2.cvtColor(image.copy(), cv2.COLOR_BGR2GRAY)
gray_image = cv2.GaussianBlur(gray_image, (5, 5), 0)
cv2.imshow('gray_image', gray_image)
cv2.waitKey(0)
image_edged = cv2.Canny(gray_image, 50, 100)
cv2.imshow('image_edged', image_edged)
cv2.waitKey(0)
print('image_edged.shape : ', image_edged.shape)
cnts = cv2.findContours(image_edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
cnts = cnts[1] if imutils.is_cv2() else cnts[0] #### #### STO USANDO CV4 --→ https://stackoverflow.com/questions/57980005/having-the-following-error-message-error-215assertion-failed-npoints-0
cntso = sorted(cnts, key=cv2.contourArea, reverse=True)
for n,i in enumerate(cntso) :
print(n, ' ---> ', cv2.contourArea(i),'...........', type(i), i.shape, i.ndim,)
#from 6. Mask and Pixel Points https://docs.opencv.org/4.x/d1/d32/tutorial_py_contour_properties.html
# mask = np.zeros(image_edged.shape,np.uint8)
mask = np.zeros(gray_image.shape)
cv2.drawContours(mask, [i], -1 , 255 , 1)
# pixelpoints = np.transpose(np.nonzero(mask))
pixelpoints = cv2.findNonZero(mask)
# print('pixelpoints : ', pixelpoints)
# print('pixelpoints : ', type(pixelpoints), pixelpoints.shape,)
# print('\n\n\n pixelpoints[:,0,0] : ', pixelpoints[: ,0,0])
# print('\n\n\n pixelpoints[:,0,1] : ', pixelpoints[: ,0,1])
coordinates = list(zip(pixelpoints[: ,0,0], pixelpoints[: ,0,1]))
# print('coordinates : ', coordinates, '\n\nlenght : ', len(coordinates))
print('coordinates lenght : ', len(coordinates))
cv2.drawContours(mask, [pixelpoints] , -1, 255, 1) ## TypeError: contours is not a numpy array, neither a scalar
cv2.imshow('mask', mask)
cv2.waitKey(0)
image_copy = image.copy()
cv2.drawContours(image_copy, [pixelpoints] , -1, (0,0,255), 1) ##pixelpoints is not a contour is just a series of pixels
cv2.imshow('image_copy', image_copy)
cv2.waitKey(0)
# print('\n\n\n i[:,0,0] : ', i[: ,0,0])
# print('\n\n\n i[:,0,1] : ', i[: ,0,1])
coordinates = list(zip(i[:,0,0], i [:,0,1]))
# print('coordinates : ', coordinates, '\n\nlenght : ', len(coordinates))
print('coordinates lenght : ', len(coordinates))
print('---')
if cv2.contourArea(i) > 400:
# print(n, ' ---> ', cv2.contourArea(i) )
# cv2.drawContours(image, [i] , -1, (0,255,255), cv2.FILLED)
cv2.drawContours(image, [i] , -1, (0,255,0), 3)
cv2.putText(image, "{}".format(n), (int(i[0][0][0]), int(i[0][0][1])), cv2.FONT_HERSHEY_SIMPLEX, 0.65, (255, 255, 255), 2)
else:
cv2.drawContours(image, [i] , -1, (0,0,255), cv2.FILLED)
cv2.putText(image, "{}".format(n), (int(i[0][0][0]), int(i[0][0][1])), cv2.FONT_HERSHEY_SIMPLEX, 0.65, (255, 255, 255), 2)
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
< /code>
Я пытаюсь получить найденные точки контуров, используя подход 6. Маска и пиксель
или только < /p>
(cnt[: ,0,0] , cnt[: ,0,1])
подход.
Что я бы попытался достичь, - это визуально проверить пути,
Но то, что мне снова не хватает, - это то, как строить контуры из точек?
Код: Выделить всё
cv2.drawContours(image_copy, [pixelpoints] , -1, (0,0,255), 1)
к моему изображению, что [pixelpoints] не является контуром, а является просто списком координат пикселей, но по какой -то странной причине команда просто нарисует контур Right (??) только на моей картинке, которая заполняет его, независимо от того, какая толщина Ключевое слово, которое я использую (здесь 1). Любая рутина/код для воссоздания контура из списка координат пикселей? DrawContours
и окончательный правильный вывод:
Подробнее здесь:
https://stackoverflow.com/questions/796 ... nts-opencv
1751053863
Anonymous
Со следующим вводом теста: test.png : и мой код: [code]import cv2 import numpy as np # import matplotlib.pyplot as plt import imutils print("Your OpenCV version: {}".format(cv2.__version__)) print("Are you using OpenCV 2.X? {}".format(imutils.is_cv2())) print("Are you using OpenCV 3.X? {}".format(imutils.is_cv3())) print("Are you using OpenCV 4.X? {}".format(imutils.is_cv4())) image_path = 'test.png' image = cv2.imread(image_path) cv2.imshow('input', image) cv2.waitKey(0) gray_image = cv2.cvtColor(image.copy(), cv2.COLOR_BGR2GRAY) gray_image = cv2.GaussianBlur(gray_image, (5, 5), 0) cv2.imshow('gray_image', gray_image) cv2.waitKey(0) image_edged = cv2.Canny(gray_image, 50, 100) cv2.imshow('image_edged', image_edged) cv2.waitKey(0) print('image_edged.shape : ', image_edged.shape) cnts = cv2.findContours(image_edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cnts = cnts[1] if imutils.is_cv2() else cnts[0] #### #### STO USANDO CV4 --→ https://stackoverflow.com/questions/57980005/having-the-following-error-message-error-215assertion-failed-npoints-0 cntso = sorted(cnts, key=cv2.contourArea, reverse=True) for n,i in enumerate(cntso) : print(n, ' ---> ', cv2.contourArea(i),'...........', type(i), i.shape, i.ndim,) #from 6. Mask and Pixel Points https://docs.opencv.org/4.x/d1/d32/tutorial_py_contour_properties.html # mask = np.zeros(image_edged.shape,np.uint8) mask = np.zeros(gray_image.shape) cv2.drawContours(mask, [i], -1 , 255 , 1) # pixelpoints = np.transpose(np.nonzero(mask)) pixelpoints = cv2.findNonZero(mask) # print('pixelpoints : ', pixelpoints) # print('pixelpoints : ', type(pixelpoints), pixelpoints.shape,) # print('\n\n\n pixelpoints[:,0,0] : ', pixelpoints[: ,0,0]) # print('\n\n\n pixelpoints[:,0,1] : ', pixelpoints[: ,0,1]) coordinates = list(zip(pixelpoints[: ,0,0], pixelpoints[: ,0,1])) # print('coordinates : ', coordinates, '\n\nlenght : ', len(coordinates)) print('coordinates lenght : ', len(coordinates)) cv2.drawContours(mask, [pixelpoints] , -1, 255, 1) ## TypeError: contours is not a numpy array, neither a scalar cv2.imshow('mask', mask) cv2.waitKey(0) image_copy = image.copy() cv2.drawContours(image_copy, [pixelpoints] , -1, (0,0,255), 1) ##pixelpoints is not a contour is just a series of pixels cv2.imshow('image_copy', image_copy) cv2.waitKey(0) # print('\n\n\n i[:,0,0] : ', i[: ,0,0]) # print('\n\n\n i[:,0,1] : ', i[: ,0,1]) coordinates = list(zip(i[:,0,0], i [:,0,1])) # print('coordinates : ', coordinates, '\n\nlenght : ', len(coordinates)) print('coordinates lenght : ', len(coordinates)) print('---') if cv2.contourArea(i) > 400: # print(n, ' ---> ', cv2.contourArea(i) ) # cv2.drawContours(image, [i] , -1, (0,255,255), cv2.FILLED) cv2.drawContours(image, [i] , -1, (0,255,0), 3) cv2.putText(image, "{}".format(n), (int(i[0][0][0]), int(i[0][0][1])), cv2.FONT_HERSHEY_SIMPLEX, 0.65, (255, 255, 255), 2) else: cv2.drawContours(image, [i] , -1, (0,0,255), cv2.FILLED) cv2.putText(image, "{}".format(n), (int(i[0][0][0]), int(i[0][0][1])), cv2.FONT_HERSHEY_SIMPLEX, 0.65, (255, 255, 255), 2) cv2.imshow('image', image) cv2.waitKey(0) cv2.destroyAllWindows() < /code> Я пытаюсь получить найденные точки контуров, используя подход 6. Маска и пиксель или только < /p> (cnt[: ,0,0] , cnt[: ,0,1])[/code] подход. Что я бы попытался достичь, - это визуально проверить пути, Но то, что мне снова не хватает, - это то, как строить контуры из точек?[code]cv2.drawContours(image_copy, [pixelpoints] , -1, (0,0,255), 1)[/code] к моему изображению, что [pixelpoints] не является контуром, а является просто списком координат пикселей, но по какой -то странной причине команда просто нарисует контур Right (??) только на моей картинке, которая заполняет его, независимо от того, какая толщина Ключевое слово, которое я использую (здесь 1). Любая рутина/код для воссоздания контура из списка координат пикселей? DrawContours и окончательный правильный вывод: Подробнее здесь: [url]https://stackoverflow.com/questions/79682425/building-contours-from-points-opencv[/url]