KG_KAIROS/Python

[KG_KAIROS] 파이썬 강의_5 (Open CV)

projectlim 2024. 7. 4. 10:37
728x90
반응형
SMALL

오늘은 어제한 open CV 복습 후 진도를 나가 보았습니다.

하지만 오전 수업은 역시 오늘도 졸리네여... 

import cv2
img = cv2.imread('C:\\mypro\\basic\\uga\\cat.jpg',cv2.IMREAD_COLOR)
print(img.shape)

#로드한 이미지의 높이 0~100 너비 50~150을 카피해서 img_roi라는 변수에 담기
#그리고 img_roi를 디스플레이


img_roi= img[0:100,50:150]


cv2.imshow('uga',img_roi)
cv2.waitKey(0)

#img_roi를 저장하기 png jpg 두가지로 저장
cv2.imwrite(r'C:\\mypro\\basic\\uga\\cat.png',img_roi)

이렇게 코드를 작성하면 jpg를 png로 저장이 가능합니다.

png생성

https://github.com/JD-edu/aiot-pi

 

GitHub - JD-edu/aiot-pi

Contribute to JD-edu/aiot-pi development by creating an account on GitHub.

github.com

강사님의 깃허브에서 Open CV code 201을 실행시켰습니다.

저는 에러 떠서 파이썬 파일을 복사 해왔어요!!

화면녹화

import cv2
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH,320)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT,240)
while (cap.isOpened()):
  ret,img = cap.read()
  cv2.imshow('my win',img)
  if cv2.waitKey(1) & 0xFF == ord('q'):
    break
cap.release()
cv2.destroyAllWindows()

코드는 여기 있습니다.

 

범위 지정도 할 수 있습니다.

 

>>HSV

 

RGB는 RED,GREEN,BLUE 입니다.

 

그럼 HSV는?

Hue(색상) Saturation(채도) Value(명도)

HSV요소에 따른 색상변화

여기서 Value값이 높아지면 색상이 진해지고 반대로 낮아진다면 어두워지네요!!

 

 

출처 : https://m.blog.naver.com/jdancor/222881600118

 

(17) 색공간과 색공간 변환 HSV, HSI, HSL

HSV/ HSL/ HSI YCbCr과 다르게 컬러를 조금더 직관적으로 표현하는 색공간입니다 YCBCR은...

blog.naver.com

 

그럼 왜 HSV를 배우냐?

우리가 개발할 때 open cv를 쓰면서 색을 판별해야 합니다.

 

RGB는 색깔로 판별하는데 3개가 필요한건 전부다 아시죠...!

하지만 HSV는 하나만 있으면 되니 오히려 더 효율적이겠죠?

그래서 자주 사용한다고 합니다.

 

 

 

그럼 HSV 코드를 돌려보겠습니다.

import cv2
import numpy as np


cap = cv2.VideoCapture(0)
while (cap.isOpened()):
  ret,img = cap.read()
  cv2.imshow('my win',img)
  img_cvt =  cv2.cvtColor( img, cv2.COLOR_BGR2HSV)
  cv2.imshow('gray',img_cvt)
  if cv2.waitKey(1) & 0xFF == ord('q'):
    break
cap.release()
cv2.destroyAllWindows()

HSV화면 출력

 

왜? 빨간 화면이 뜰까요??

우리가 사용하는 디스플레이는 RGB를 사용하니까 그렇습니다.

HSV로 출력이 됐기 때문입니다.

 

그래서 이번엔 미션을 주셨는데요.

1. 카메라 살려라

2. 아래에 절반 roi하라

3. 듀얼 디스플레이로 띄워라

4. roi를 hsv로 띄워라

#카메라 살리고
#아래절반 roi
#dual display
#roi를 hsv로
import cv2
import numpy as np


cap = cv2.VideoCapture(0)
#cap.set(3,320) # 전문가들이이렇게 쓰지 말라고 했다고함.
while (cap.isOpened()):
  ret,img = cap.read()
  print(img.shape)
  img_roi= img[240:480, 0:640]
  img_hsv=cv2.cvtColor(img_roi,cv2.COLOR_BGR2HSV)
  cv2.imshow('my win',img)
  cv2.imshow('roi',img_roi)
  cv2.imshow('hsv',img_hsv)
  
  img_cvt =  cv2.cvtColor( img, cv2.COLOR_BGR2HSV)
  cv2.imshow('gray',img_cvt)
  if cv2.waitKey(1) & 0xFF == ord('q'):
    break
cap.release()
cv2.destroyAllWindows()

 

 

 

이번에는 카메라 스트리밍 출력에 무작위 원을 움직이게 하는 미션을 진행하였습니다.

 

import numpy as np
import cv2
from random import randint

cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH,320)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT,640)
while (cap.isOpened()):
  
  ret,img = cap.read()
  cv2.circle(img,(randint(0,320),randint(0,240)),50,(0,0,255),10)
  cv2.imshow('my win',img)
  
  if cv2.waitKey(1) & 0xFF == ord('q'):
    break
cap.release()
cv2.destroyAllWindows()

카메라에 원을 띄워서 랜덤으로 돌리는 출력물

자 이렇게 연습하다가.

이제 로봇 프로젝트에도 필요한걸 해보았습니다.

바로 오렌지색만 판별하는 겁니다!

 

import cv2
cap = cv2.VideoCapture(0)
import numpy as np

while True:
    ret, img = cap.read()
    if ret:
        cv2.imshow('win',img)
        upper_orange = np.array([40,255,255])
        lower_orange = np.array([0,10,10])
        img_hsv= cv2.cvtColor(img,cv2.COLOR_RGB2HSV)
        mask = cv2.inRange(img_hsv,lower_orange,upper_orange)
        cv2.imshow('hsv',img_hsv)
        cv2.imshow('mask',mask)
        
        key = cv2.waitKey(1)
        if key == 27:
            #27은 esc라서 쓰는거임.
            break
        
cap.release()
cv2.destroyAllWindows()

lower_orange = np.array([0,10,10])

여길 수정하면서 해나가고 있습니다.

 

 

그리고 레나가 이제 나왔습니다.

학부시절 했던 필터링 통해서 예제 사용했는데 슬슬 사용해보겠습니다.

우선 레나를 띄우는것을 목표로 하였습니다. 잘나오죠?

 

 

목표는 마우스 드래그해서 드래그 한 공간만 저장하기!!!

이미지 드래그 저장

import cv2
import numpy as np


img = cv2.imread("C:\\Users\\lhj89\\Downloads\\aiot-pi-master\\aiot-pi-master\\OpenCV_code\\lena.jpg",cv2.IMREAD_COLOR)
x,y,w,h	= cv2.selectROI('img', img, False)
if w and h:
    roi = img[y:y+h, x:x+w]
    cv2.imshow('cropped', roi)  # ROI 지정 영역을 새창으로 표시
    cv2.moveWindow('cropped', 0, 0) # 새창을 화면 좌측 상단에 이동
    cv2.imwrite('./cropped2.jpg', roi)   # ROI 영역만 파일로 저장

cv2.waitKey(0)
cv2.destroyAllWindows()

이렇게 roi 영역만 파일로 저장 할 수 있습니다.

 

그리고 확장된 dilate입니다.

import cv2
import numpy as np


cap = cv2.VideoCapture(0)
while (cap.isOpened()):
  ret,img = cap.read()
  cv2.imshow('my win',img)
  img_cvt =  cv2.cvtColor( img, cv2.COLOR_BGR2HSV)
  # Orange color
  # RGB: 215 109 85
  # Hue value: 6
  img_mask = cv2.inRange( img_cvt, (np.array([ -4, 100, 100])), (np.array([ 16, 255, 255])))
  cv2.imshow('mask',img_mask)
  kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
  img_dilate = cv2.dilate(img_mask, kernel, iterations = 1)
  cv2.imshow('dilate',img_dilate)
  if cv2.waitKey(1) & 0xFF == ord('q'):
    break
cap.release()
cv2.destroyAllWindows()

오렌지색만 체크해야하는데 제 피부도 오렌지 비슷한가 봅니다..

 

이번엔 인간극장에서 봤을것 같은 필터를 사용해 보겠습니다.

바로 canny라는 필터인데요!!

import cv2


cap = cv2.VideoCapture(0)
while (cap.isOpened()):
  ret,img = cap.read()
  cv2.imshow('my win',img)
  img_canny = cv2.Canny(img, 150, 150)
  cv2.imshow('canny',img_canny)
  if cv2.waitKey(1) & 0xFF == ord('q'):
    break
cap.release()
cv2.destroyAllWindows()

1002번 코드를 사용해서 속성값을 150으로 만들어 봤습니다.

이빨도 잘보이나 해서 이~~를 해봤습니다.

 

외곽선은 중요하다고 합니다.

로봇공학 입장에선 외곽선을 따서 물체를 확인하는것.

 

그리고 hsv로 물체확인도 해보겠습니다.

 

해당코드는

import cv2
import numpy as np

img = cv2.imread('C:\\Users\\lhj89\\Downloads\\aiot-pi-master\\aiot-pi-master\\OpenCV_code\\image_single_obj.jpg')
cv2.imshow('win',img)
img_hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
# low=np.array([0,50,50])
# upper=np.array([40,255,255])
# img_mask = cv2.inRange(img,low,upper)
cv2.imshow('hsv',img_hsv)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

마지막은 오렌지 영상추출과 마스킹 응용한영상 결과물입니다.

728x90
반응형
LIST