Open Project/텐서플로_사물인식

OpenCV 정리해보자 ( 파이썬 / 라즈베리파이)

LEEHANDS 2022. 6. 3. 14:41
반응형

참고 사이트 : https://076923.github.io/posts/Python-opencv-28/

 

Python OpenCV 강좌 : 제 28강 - 직선 검출

직선 검출(Line Detection)

076923.github.io

OpenCV 는 Open Source Computer Vision Library 의 약어

실시간 영상 처리에 중점을 둔 영상 처리 라이브러리로써 Apache2.0 라이선스하에 배포되어 학술적 용도 외에도 상업적으로도 사용가능하다. 참 좋네잉

 

OpenCV 는 계산 효율성과 실시간 처리에 중점을 두고 설계

500가지 넘는 알고리즘에 최적화돼있으며

 

물체인식, 얼굴인식, 등 활용할 수 있다.

 

필자가 사용하는 CV2 의 현재 버전은 4.5.3 으로 라즈베리파이4 2G 모델을 사용중입니다.

 

이 포스팅에서 사용한 예제 코드는 아래 gitlab 에서 다운로드 가능합니다.

http://gitlab.leehands.com/ai/opencv

 

ai / opencv

GitLab Community Edition

gitlab.leehands.com


저장된 이미지 읽기 출력 쓰기

 

import cv2

def main():
    image = cv2.imread("image/sample.jpg",cv2.IMREAD_GRAYSCALE) # Read Image file (or IMREAD_COLOR )
    cv2.imshow("sample",image) # Output image
    cv2.waitKey(0)  # Wait Keyboard input , if 0 , infinite wait
    cv2.destroyAllWindows() # exit windows
    cv2.imwrite("image/sample_gray.jpg",image) # write image
if __name__ == '__main__':
    main()

cv2.IMREAD_UNCHANGED : 원본 사용
cv2.IMREAD_GRAYSCALE : 1 채널, 그레이스케일 적용
cv2.IMREAD_COLOR : 3 채널, BGR 이미지 사용
cv2.IMREAD_ANYDEPTH : 이미지에 따라 정밀도를 16/32비트 또는 8비트로 사용
cv2.IMREAD_ANYCOLOR : 가능한 3 채널, 색상 이미지로 사용
cv2.IMREAD_REDUCED_GRAYSCALE_2 : 1 채널, 1/2 크기, 그레이스케일 적용
cv2.IMREAD_REDUCED_GRAYSCALE_4 : 1 채널, 1/4 크기, 그레이스케일 적용
cv2.IMREAD_REDUCED_GRAYSCALE_8 : 1 채널, 1/8 크기, 그레이스케일 적용
cv2.IMREAD_REDUCED_COLOR_2 : 3 채널, 1/2 크기, BGR 이미지 사용
cv2.IMREAD_REDUCED_COLOR_4 : 3 채널, 1/4 크기, BGR 이미지 사용
cv2.IMREAD_REDUCED_COLOR_8 : 3 채널, 1/8 크기, BGR 이미지 사용


카메라 출력

import cv2

def main():
    capture = cv2.VideoCapture(0)
    capture.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
    capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
  
    while cv2.waitKey(10) < 0:
        ret , frame = capture.read()
        cv2.imshow("Chap2_camera",frame)
  
    capture.release()
    cv2.destroyAllWindows()

if __name__ == '__main__':
    main()

도형 그리기

import cv2
import numpy as np

def main():
    src = np.zeros((768,1366,3),dtype=np.uint8)

    src = cv2.line(src, (100,100),(1200,100),(0,0,255),3,cv2.LINE_AA)
    src = cv2.circle(src,(300,300),50,(0,255,0),cv2.FILLED, cv2.LINE_4)
    src = cv2.rectangle(src,(500,200),(1000,400),(255,0,0),5,cv2.LINE_8)
    src = cv2.ellipse(src,(1200,300),(100,50),0,90,180,(255,255,0),2)

    pts1 = np.array([[100,500],[300,500],[200,600]])
    pts2 = np.array([[600,500],[800,500],[700,600]])

    src = cv2.polylines(src,[pts1],True,(0,255,255),2)
    src = cv2.fillPoly(src,[pts2],(255,0,255),cv2.LINE_AA)

    src = cv2.putText(src, "SAMPLE",(900,600),cv2.FONT_HERSHEY_COMPLEX,2,(255,255,255),3)

    cv2.imshow("src",src)
    cv2.waitKey()
    cv2.destroyAllWindows()

if __name__ == '__main__':
    main()

캡쳐 녹화

import datetime
import cv2

def main():
    capture = cv2.VideoCapture(0)
    capture.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
    capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    record = False

    while True:
       # if(capture.get(cv2.CAP_PROP_POS_FRAMES) == capture.get(cv2.CAP_PROP_FRAME_COUNT)):
       #     capture.open("image/chap4_sample.mp4")

        ret,frame = capture.read()
        cv2.imshow("videoframe",frame)

        now = datetime.datetime.now().strftime("%d_%H-%M-%S")
        key = cv2.waitKey(33)


        if key == 27:
            print("exit")
            break
        elif key == 65: #'A'
            print("capture")
            cv2.imwrite("image/"+str(now)+".png",frame)
        elif key == 66: #'B'
            print("record")
            record = True
            video = cv2.VideoWriter("image/"+str(now)+".avi",fourcc,20.0,(frame.shape[1],frame.shape[0]))
        elif key == 67: #'C'
            print("stop record")
            record = False
            video.release()

        if record == True:
            print("recording..")
            video.write(frame)
    capture.release()
    cv2.destroyAllWindows()

if __name__ == '__main__':
    main()
반응형