Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

i want to output coordinates.

hi all

C:\fakepath\캡처.PNG

i want to output blue circle and red circle's coordinates. (just (x, y) )

but i don't know how. :(

how to get coordinates?

I've already made tracking objects according to color. But I want to create coordinates for the object that I'm tracking

this is my code

import cv2 as cv import numpy as np

color1 = 0 color2 = 0

ranges = 20 set_color = False step = 0

def nothing(x): global color1, color2 global lower_blueA1, lower_blueA2, lower_blueA3 global upper_blueA1, upper_blueA2, upper_blueA3 global lower_blueB1, lower_blueB2, lower_blueB3 global upper_blueB1, upper_blueB2, upper_blueB3

saturation_th1 = cv.getTrackbarPos('saturation_th1', 'img_result')
value_th1 = cv.getTrackbarPos('value_th1', 'img_result')

saturation_th2 = cv.getTrackbarPos('saturation_th2', 'img_result')
value_th2 = cv.getTrackbarPos('value_th2', 'img_result')

color1 = int(color1)
color2 = int(color2)

# HSV 색공간에서 마우스 클릭으로 얻은 픽셀값과 유사한 필셀값의 범위를 정합니다.
if color1 < ranges:
    lower_blueA1 = np.array([color1 - ranges + 180, saturation_th1, value_th1])
    upper_blueA1 = np.array([180, 255, 255])
    lower_blueA2 = np.array([0, saturation_th1, value_th1])
    upper_blueA2 = np.array([color1, 255, 255])
    lower_blueA3 = np.array([color1, saturation_th1, value_th1])
    upper_blueA3 = np.array([color1 + ranges, 255, 255])
    #     print(i-range+180, 180, 0, i)
    #     print(i, i+range)

elif color1 > 180 - ranges:
    lower_blueA1 = np.array([color1, saturation_th1, value_th1])
    upper_blueA1 = np.array([180, 255, 255])
    lower_blueA2 = np.array([0, saturation_th1, value_th1])
    upper_blueA2 = np.array([color1 + ranges - 180, 255, 255])
    lower_blueA3 = np.array([color1 - ranges, saturation_th1, value_th1])
    upper_blueA3 = np.array([color1, 255, 255])
    #     print(i, 180, 0, i+range-180)
    #     print(i-range, i)
else:
    lower_blueA1 = np.array([color1, saturation_th1, value_th1])
    upper_blueA1 = np.array([color1 + ranges, 255, 255])
    lower_blueA2 = np.array([color1 - ranges, saturation_th1, value_th1])
    upper_blueA2 = np.array([color1, 255, 255])
    lower_blueA3 = np.array([color1 - ranges, saturation_th1, value_th1])
    upper_blueA3 = np.array([color1, 255, 255])
    #     print(i, i+range)
    #     print(i-range, i)


if color2 < ranges:
    lower_blueB1 = np.array([color2 - ranges + 180, saturation_th2, value_th2])
    upper_blueB1 = np.array([180, 255, 255])
    lower_blueB2 = np.array([0, saturation_th2, value_th2])
    upper_blueB2 = np.array([color2, 255, 255])
    lower_blueB3 = np.array([color2, saturation_th2, value_th2])
    upper_blueB3 = np.array([color2 + ranges, 255, 255])
    #     print(i-range+180, 180, 0, i)
    #     print(i, i+range)

elif color2 > 180 - ranges:
    lower_blueB1 = np.array([color2, saturation_th2, value_th2])
    upper_blueB1 = np.array([180, 255, 255])
    lower_blueB2 = np.array([0, saturation_th2, value_th2])
    upper_blueB2 = np.array([color2 + ranges - 180, 255, 255])
    lower_blueB3 = np.array([color2 - ranges, saturation_th2, value_th2])
    upper_blueB3 = np.array([color2, 255, 255])
    #     print(i, 180, 0, i+range-180)
    #     print(i-range, i)
else:
    lower_blueB1 = np.array([color2, saturation_th2, value_th2])
    upper_blueB1 = np.array([color2 + ranges, 255, 255])
    lower_blueB2 = np.array([color2 - ranges, saturation_th2, value_th2])
    upper_blueB2 = np.array([color2, 255, 255])
    lower_blueB3 = np.array([color2 - ranges, saturation_th2, value_th2])
    upper_blueB3 = np.array([color2, 255, 255])
    #     print(i, i+range)
    #     print(i-range, i)

cv.namedWindow('img_color') cv.namedWindow('img_result')

cv.createTrackbar('saturation_th1', 'img_result', 0, 255, nothing) cv.setTrackbarPos('saturation_th1', 'img_result', 30) cv.createTrackbar('value_th1', 'img_result', 0, 255, nothing) cv.setTrackbarPos('value_th1', 'img_result', 30) cv.createTrackbar('saturation_th2', 'img_result', 0, 255, nothing) cv.setTrackbarPos('saturation_th2', 'img_result', 30) cv.createTrackbar('value_th2', 'img_result', 0, 255, nothing) cv.setTrackbarPos('value_th2', 'img_result', 30)

cap = cv.VideoCapture(1)

while(True):

ret,img_color = cap.read()
img_color = cv.flip(img_color, 1)

if ret == False:
    continue;


img_color2 = img_color.copy()
img_hsv = cv.cvtColor(img_color2, cv.COLOR_BGR2HSV)

height, width = img_color.shape[:2]
cx = int(width / 2)
cy = int(height / 2)


if set_color == False:

    rectangle_color = (0, 255, 0)

    if step == 1:
        rectangle_color = (0, 0, 255)

    cv.rectangle(img_color, (cx - 20, cy - 20), (cx + 20, cy + 20), rectangle_color, 5)


else:

    # 범위 값으로 HSV 이미지에서 마스크를 생성합니다.
    img_maskA1 = cv.inRange(img_hsv, lower_blueA1, upper_blueA1)
    img_maskA2 = cv.inRange(img_hsv, lower_blueA2, upper_blueA2)
    img_maskA3 = cv.inRange(img_hsv, lower_blueA3, upper_blueA3)
    temp = cv.bitwise_or(img_maskA1, img_maskA2)
    img_maskA = cv.bitwise_or(img_maskA3, temp)

    img_maskB1 = cv.inRange(img_hsv, lower_blueB1, upper_blueB1)
    img_maskB2 = cv.inRange(img_hsv, lower_blueB2, upper_blueB2)
    img_maskB3 = cv.inRange(img_hsv, lower_blueB3, upper_blueB3)
    temp = cv.bitwise_or(img_maskB1, img_maskB2)
    img_maskB = cv.bitwise_or(temp, img_maskB3)


    # 모폴로지 연산
    kernel = np.ones((11,11), np.uint8)
    img_maskA = cv.morphologyEx(img_maskA, cv.MORPH_OPEN, kernel)
    img_maskA = cv.morphologyEx(img_maskA, cv.MORPH_CLOSE, kernel)


    kernel = np.ones((11,11), np.uint8)
    img_maskB = cv.morphologyEx(img_maskB, cv.MORPH_OPEN, kernel)
    img_maskB = cv.morphologyEx(img_maskB, cv.MORPH_CLOSE, kernel)


    # 마스크 이미지로 원본 이미지에서 범위값에 해당되는 영상 부분을 획득합니다.
    img_maskC = cv.bitwise_or(img_maskA, img_maskB)
    img_result = cv.bitwise_and(img_color, img_color, mask=img_maskC)


    # 라벨링
    numOfLabelsA, img_labelA, statsA, centroidsA = cv.connectedComponentsWithStats(img_maskA)

    for idx, centroid in enumerate(centroidsA):
        if statsA[idx][0] == 0 and statsA[idx][1] == 0:
            continue

        if np.any(np.isnan(centroid)):
            continue

        x,y,width,height,area = statsA[idx]
        centerX1,centerY1 = int(centroid[0]), int(centroid[1])

        if area > 1500:
            cv.circle(img_color, (centerX1, centerY1), 10, (0,0,255), 10)
            cv.rectangle(img_color, (x,y), (x+width,y+height), (0,0,255))


    numOfLabelsB, img_labelB, statsB, centroidsB = cv.connectedComponentsWithStats(img_maskB)
    for idx, centroid in enumerate(centroidsB):
        if statsB[idx][0] == 0 and statsB[idx][1] == 0:
            continue

        if np.any(np.isnan(centroid)):
            continue

        x,y,width,height,area = statsB[idx]
        centerX2,centerY2 = int(centroid[0]), int(centroid[1])

        if area > 1500:
            cv.circle(img_color, (centerX2, centerY2), 10, (255,0,0), 10)
            cv.rectangle(img_color, (x,y), (x+width,y+height), (255,0,0))








    cv.imshow('img_result', img_result)


cv.imshow('img_color', img_color)



key = cv.waitKey(1) & 0xFF

if key == 27: # esc
    break

elif key == 32: # space
    if step == 0:
        roi = img_color2[cy-20:cy+20, cx-20:cx+20]
        roi = cv.medianBlur(roi, 3)
        cv.imshow("roi1", roi)
        hsv = cv.cvtColor(roi, cv.COLOR_BGR2HSV)
        h,s,v = cv.split(hsv)
        color1 = h.mean()
        print(color1)
        step += 1

    elif step == 1:
        roi = img_color2[cy-20:cy+20, cx-20:cx+20]
        roi = cv.medianBlur(roi, 3)
        cv.imshow("roi2", roi)
        hsv = cv.cvtColor(roi, cv.COLOR_BGR2HSV)
        h,s,v = cv.split(hsv)
        color2 = h.mean()
        set_color = True
        nothing(0)
        print(color2)
        step += 1

cap.release() cv.destroyAllWindows()

i want to output coordinates.

hi all

C:\fakepath\캡처.PNG

i want to output blue circle and red circle's coordinates. (just (x, y) )

but i don't know how. :(

how to get coordinates?

I've already made tracking objects according to color. But I want to create coordinates for the object that I'm tracking

this is my code

import cv2 as cv
import numpy as np

np color1 = 0 color2 = 0

0 ranges = 20 set_color = False step = 0

0 def nothing(x): global color1, color2 global lower_blueA1, lower_blueA2, lower_blueA3 global upper_blueA1, upper_blueA2, upper_blueA3 global lower_blueB1, lower_blueB2, lower_blueB3 global upper_blueB1, upper_blueB2, upper_blueB3

upper_blueB3

    saturation_th1 = cv.getTrackbarPos('saturation_th1', 'img_result')
 value_th1 = cv.getTrackbarPos('value_th1', 'img_result')

 saturation_th2 = cv.getTrackbarPos('saturation_th2', 'img_result')
 value_th2 = cv.getTrackbarPos('value_th2', 'img_result')

 color1 = int(color1)
 color2 = int(color2)

 # HSV 색공간에서 마우스 클릭으로 얻은 픽셀값과 유사한 필셀값의 범위를 정합니다.
 if color1 < ranges:
     lower_blueA1 = np.array([color1 - ranges + 180, saturation_th1, value_th1])
     upper_blueA1 = np.array([180, 255, 255])
     lower_blueA2 = np.array([0, saturation_th1, value_th1])
     upper_blueA2 = np.array([color1, 255, 255])
     lower_blueA3 = np.array([color1, saturation_th1, value_th1])
     upper_blueA3 = np.array([color1 + ranges, 255, 255])
     #     print(i-range+180, 180, 0, i)
     #     print(i, i+range)

 elif color1 > 180 - ranges:
     lower_blueA1 = np.array([color1, saturation_th1, value_th1])
     upper_blueA1 = np.array([180, 255, 255])
     lower_blueA2 = np.array([0, saturation_th1, value_th1])
     upper_blueA2 = np.array([color1 + ranges - 180, 255, 255])
     lower_blueA3 = np.array([color1 - ranges, saturation_th1, value_th1])
     upper_blueA3 = np.array([color1, 255, 255])
     #     print(i, 180, 0, i+range-180)
     #     print(i-range, i)
 else:
     lower_blueA1 = np.array([color1, saturation_th1, value_th1])
     upper_blueA1 = np.array([color1 + ranges, 255, 255])
     lower_blueA2 = np.array([color1 - ranges, saturation_th1, value_th1])
     upper_blueA2 = np.array([color1, 255, 255])
     lower_blueA3 = np.array([color1 - ranges, saturation_th1, value_th1])
     upper_blueA3 = np.array([color1, 255, 255])
     #     print(i, i+range)
     #     print(i-range, i)


 if color2 < ranges:
     lower_blueB1 = np.array([color2 - ranges + 180, saturation_th2, value_th2])
     upper_blueB1 = np.array([180, 255, 255])
     lower_blueB2 = np.array([0, saturation_th2, value_th2])
     upper_blueB2 = np.array([color2, 255, 255])
     lower_blueB3 = np.array([color2, saturation_th2, value_th2])
     upper_blueB3 = np.array([color2 + ranges, 255, 255])
     #     print(i-range+180, 180, 0, i)
     #     print(i, i+range)

 elif color2 > 180 - ranges:
     lower_blueB1 = np.array([color2, saturation_th2, value_th2])
     upper_blueB1 = np.array([180, 255, 255])
     lower_blueB2 = np.array([0, saturation_th2, value_th2])
     upper_blueB2 = np.array([color2 + ranges - 180, 255, 255])
     lower_blueB3 = np.array([color2 - ranges, saturation_th2, value_th2])
     upper_blueB3 = np.array([color2, 255, 255])
     #     print(i, 180, 0, i+range-180)
     #     print(i-range, i)
 else:
     lower_blueB1 = np.array([color2, saturation_th2, value_th2])
     upper_blueB1 = np.array([color2 + ranges, 255, 255])
     lower_blueB2 = np.array([color2 - ranges, saturation_th2, value_th2])
     upper_blueB2 = np.array([color2, 255, 255])
     lower_blueB3 = np.array([color2 - ranges, saturation_th2, value_th2])
     upper_blueB3 = np.array([color2, 255, 255])
     #     print(i, i+range)
     #     print(i-range, i)

cv.namedWindow('img_color') cv.namedWindow('img_result')

cv.namedWindow('img_result') cv.createTrackbar('saturation_th1', 'img_result', 0, 255, nothing) cv.setTrackbarPos('saturation_th1', 'img_result', 30) cv.createTrackbar('value_th1', 'img_result', 0, 255, nothing) cv.setTrackbarPos('value_th1', 'img_result', 30) cv.createTrackbar('saturation_th2', 'img_result', 0, 255, nothing) cv.setTrackbarPos('saturation_th2', 'img_result', 30) cv.createTrackbar('value_th2', 'img_result', 0, 255, nothing) cv.setTrackbarPos('value_th2', 'img_result', 30)

30) cap = cv.VideoCapture(1)

while(True):

cv.VideoCapture(1)


while(True):

    ret,img_color = cap.read()
 img_color = cv.flip(img_color, 1)

 if ret == False:
     continue;


 img_color2 = img_color.copy()
 img_hsv = cv.cvtColor(img_color2, cv.COLOR_BGR2HSV)

 height, width = img_color.shape[:2]
 cx = int(width / 2)
 cy = int(height / 2)


 if set_color == False:

     rectangle_color = (0, 255, 0)

     if step == 1:
         rectangle_color = (0, 0, 255)

     cv.rectangle(img_color, (cx - 20, cy - 20), (cx + 20, cy + 20), rectangle_color, 5)


 else:

     # 범위 값으로 HSV 이미지에서 마스크를 생성합니다.
     img_maskA1 = cv.inRange(img_hsv, lower_blueA1, upper_blueA1)
     img_maskA2 = cv.inRange(img_hsv, lower_blueA2, upper_blueA2)
     img_maskA3 = cv.inRange(img_hsv, lower_blueA3, upper_blueA3)
     temp = cv.bitwise_or(img_maskA1, img_maskA2)
     img_maskA = cv.bitwise_or(img_maskA3, temp)

     img_maskB1 = cv.inRange(img_hsv, lower_blueB1, upper_blueB1)
     img_maskB2 = cv.inRange(img_hsv, lower_blueB2, upper_blueB2)
     img_maskB3 = cv.inRange(img_hsv, lower_blueB3, upper_blueB3)
     temp = cv.bitwise_or(img_maskB1, img_maskB2)
     img_maskB = cv.bitwise_or(temp, img_maskB3)


     # 모폴로지 연산
     kernel = np.ones((11,11), np.uint8)
     img_maskA = cv.morphologyEx(img_maskA, cv.MORPH_OPEN, kernel)
     img_maskA = cv.morphologyEx(img_maskA, cv.MORPH_CLOSE, kernel)


     kernel = np.ones((11,11), np.uint8)
     img_maskB = cv.morphologyEx(img_maskB, cv.MORPH_OPEN, kernel)
     img_maskB = cv.morphologyEx(img_maskB, cv.MORPH_CLOSE, kernel)


     # 마스크 이미지로 원본 이미지에서 범위값에 해당되는 영상 부분을 획득합니다.
     img_maskC = cv.bitwise_or(img_maskA, img_maskB)
     img_result = cv.bitwise_and(img_color, img_color, mask=img_maskC)


     # 라벨링
     numOfLabelsA, img_labelA, statsA, centroidsA = cv.connectedComponentsWithStats(img_maskA)

     for idx, centroid in enumerate(centroidsA):
         if statsA[idx][0] == 0 and statsA[idx][1] == 0:
             continue

         if np.any(np.isnan(centroid)):
             continue

         x,y,width,height,area = statsA[idx]
         centerX1,centerY1 = int(centroid[0]), int(centroid[1])

         if area > 1500:
             cv.circle(img_color, (centerX1, centerY1), 10, (0,0,255), 10)
             cv.rectangle(img_color, (x,y), (x+width,y+height), (0,0,255))


     numOfLabelsB, img_labelB, statsB, centroidsB = cv.connectedComponentsWithStats(img_maskB)
     for idx, centroid in enumerate(centroidsB):
         if statsB[idx][0] == 0 and statsB[idx][1] == 0:
             continue

         if np.any(np.isnan(centroid)):
             continue

         x,y,width,height,area = statsB[idx]
         centerX2,centerY2 = int(centroid[0]), int(centroid[1])

         if area > 1500:
             cv.circle(img_color, (centerX2, centerY2), 10, (255,0,0), 10)
             cv.rectangle(img_color, (x,y), (x+width,y+height), (255,0,0))








     cv.imshow('img_result', img_result)


 cv.imshow('img_color', img_color)



 key = cv.waitKey(1) & 0xFF

 if key == 27: # esc
     break

 elif key == 32: # space
     if step == 0:
         roi = img_color2[cy-20:cy+20, cx-20:cx+20]
         roi = cv.medianBlur(roi, 3)
         cv.imshow("roi1", roi)
         hsv = cv.cvtColor(roi, cv.COLOR_BGR2HSV)
         h,s,v = cv.split(hsv)
         color1 = h.mean()
         print(color1)
         step += 1

     elif step == 1:
         roi = img_color2[cy-20:cy+20, cx-20:cx+20]
         roi = cv.medianBlur(roi, 3)
         cv.imshow("roi2", roi)
         hsv = cv.cvtColor(roi, cv.COLOR_BGR2HSV)
         h,s,v = cv.split(hsv)
         color2 = h.mean()
         set_color = True
         nothing(0)
         print(color2)
         step += 1





cap.release()
cv.destroyAllWindows()

cap.release() cv.destroyAllWindows()