Как нарисовать контур на изображении из файла csv

#python #numpy #csv #opencv-drawcontour

#python #numpy #csv #opencv #контур

Вопрос:

Мне нужно нарисовать контур из файла CSV, я получаю каждый список x, y отдельно, но мне нужно создать кортежи, чтобы использовать их для функции полилинии, но я получаю 'int' object is not iterable !

Код:

 import numpy as np
import cv2
import matplotlib.pyplot as plt
image5= cv2.imread("C:/Users/Pc/Desktop/code prjt/5_Vesicule.jpg")
cv2.imshow("im",image5)
cv2.waitKey()
centrev5 = pd.read_csv("C:/Users/Pc/Desktop/code prjt/centrev5.csv",sep=";")
print(centrev5)
cx=int(centrev5.get(['centreX'][0]) )
cy =int(centrev5.get(['centreY'][0]))
image = cv2.circle(image5, (cx,cy), radius=0, color=(255, 0, 0), thickness=10)
cv2.imshow("centre",image)
cv2.waitKey()

point5 = pd.read_csv("C:/Users/Pc/Desktop/code prjt/point5.csv",sep=";")
print(point5)

for i in range(len(point5)):
    x=int(point5.values[i][1])
    y=int(point5.values[i][2])
   # transform x,y vectors to tuples
    c = [tuple(x), tuple(y)]
    img = cv2.polylines(image5, c, 1, (0,0,255),4)


cv2.imshow("contour",image5)
cv2.waitKey()


#print(c)

#c = [i for i in zip(x, y)]
#c = list(zip(x,y)) 
#[(x[i],y[i]) for i in range(min(len(x),len(y)))]
 

ошибка заключается в том, что объект ‘int’ не может быть повторен

результат x, y

Комментарии:

1. cv2.polylines(image5, zip(x,y), 1, (0,0,255),4) решает ли это вашу проблему?

2. нет, проблема в c = [кортеж (x), кортеж (y)]

3. попробуйте напечатать x и y и обновите свой вопрос, чтобы включить выходные данные

4. Я понимаю это, я предлагаю вам прокомментировать эту строку c = ... и заменить вашу cv2.pol.... строку на то, что я упоминал ранее

5. спасибо за вашу помощь, я сделал то, что вы мне сказали, но это та же ошибка

Ответ №1:

Ваша проблема в том, что вы пытаетесь преобразовать int в кортеж her tuple(x) . x определяется как an int . int s не являются итеративными. Таким образом, он не может быть преобразован в tuple директив. Если вы хотите иметь набор, который содержит только x тогда, используйте (x,) (остерегайтесь конца , ).

cv2.polylines() ожидает, что его второй аргумент будет иметь вид

 [(x1,y1),(x2,y2),...)]
 

и затем нарисует полигональное соединение всех точек в списке.

Это означает, что вам не нужен цикл for. Он уже интегрирован cv2.polylines() . Смотрите здесь

Чтобы привести ваши данные в правильный формат, я бы предложил следующее:

 points = [(value[1],value[2]) for value in point5.values]
 

а затем нарисуйте линии следующим образом:

 cv2.polylines(image5, points, 1, (0,0,255),4)