[참고]

 

1. Contours

  • 정확도를 높이기 위해 Binary Image를 사용
  • threshold나 canny edge를 선처리로 수행함
  • cv2.findContours() 함수는 원본 이미지를 직접 수정하기 때문에 원본이미지를 보존하려면 copy해서 사용
  • openCV에서 contours를 찾는 것은 검은색 배경에서 흰 대상을 찾는 것과 비슷함. 그래서 대상은 흰색, 배경은 검은색으로 해야 함

 

import cv2
import numpy as np 

img = cv2.imread('circle1.png')
imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(imgray, 127, 255, 0)

contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
image = cv2.drawContours(img, contours, -1, (0,0,255), 1)

cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

[결과]

cv2.findContours() 확인

[참고]

 

[code]

import cv2

capture = cv2.VideoCapture(0)
frame_width = int(capture.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height= int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT))
print('Frame width:', frame_width)
print('Frame height: ', frame_height)

video = cv2.VideoWriter('captured_video.avi', cv2.VideoWriter_fourcc(*'XVID'), 25, (frame_width, frame_height))

while True:
    has_frame, frame = capture.read()
    if not has_frame:
        print('Can\'t get frame')
        break
    
    video.write(frame)

    cv2.imshow('frame', frame)
    key = cv2.waitKey(3)
    if key == 27:
        print('Pressed ESC')
        break

capture.release()
video.release()
cv2.destroyAllWindows()

 

  • 비디오 쓰기는 cv2.VideoWriter 클래스를 사용해 수행됨
  • 생성자는 출력 비디오 경로, 비디오 코드, 프레임 속도 및 프레임 크기를 지정하는 4개의 문자 코드(FOURCC)를 받음
  • 코덱 코드 : MPEG-1의 경우 P,I,M,1이 포함 /모션-JPEG은 M,J,P,G / XVID MPEG-4에는 X,V,I,D / H.264는 H,2,6,4 포함
[참고]


#test_openCV.py

import cv2

capture = cv2.VideoCapture(0)

while True:
    has_frame, frame = capture.read()
    if not has_frame:
        print('Can\'t get frame')
        break
    
    cv2.imshow('frame', frame)
    key = cv2.waitKey(3)
    if key == 27:
        print('Pressed ESC')
        break

capture.release()
cv2.destroyAllWindows()


[결과]

  • 데스크탑 PC(Windows10)로 인텔 리얼센스(D435) 연결 후 USB 카메라 영상 재생 확인
  • 노트북(Ubuntu16.04)에서는 cv2.VideoCapture(0)이 노트북 카메라 인식. cv2.VideoCapture(1)은 USB 카메라 인식
  • SDK 설치 없이 가능한지 확인 필요 (FLIR 카메라는 cv2.VideoCapture(1)로 인식 안 됨, 인텔 리얼센스, 로지텍 USB 카메라는 인식 됨)





[참고]


#두개의 이미지를 비교해서 차이점 보여주기

# 파일명 : test.py


from skimage.measure import compare_ssim

import argparse

import imutils

import cv2


ap = argparse.ArgumentParser()

ap.add_argument("-f", "--first", required = True, help = "first input image")

ap.add_argument("-s", "--second", required = True, help = "second")

args = vars(ap.parse_args())


imageA = cv2.imread(args["first"])

imageB = cv2.imread(args["second"])


grayA = cv2.cvtColor(imageA, cv2.COLOR_BGR2GRAY)

grayB = cv2.cvtColor(imageB, cv2.COLOR_BGR2GRAY)


(score, diff) = compare_ssim(grayA, grayB, full = True)

diff = (diff * 255).astype("uint8")

print("SSIM: {}".format(score))


thresh = cv2.threshold(diff, 0, 255, cv2.THRESH_BINARY_INV |cv2.THRESH_OTSU)[1]

cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

cnts = imutils.grab_contours(cnts)


cv2.imshow("Original", imageA)

cv2.imshow("Modified", imageB)

# cv2.imshow("grayA", grayA)

# cv2.imshow("grayB", grayB)


cv2.imshow("Diff", diff)

cv2.imshow("Thresh", thresh)

cv2.waitKey(0)


[실행]

test.py 폴더 안에 비교할 사진(예시 : 1.jpg, 2.jpg) 넣고 터미널 실행


$python test.py --first 1.jpg --second 2.jpg


[결과]

  • 개인정보는 모자이크 처리함
  • 2개의 input image에서 차이점을 표시해줌



[참고]

  • 파이썬3로 컴퓨터 비전 다루기 / 사우랍 카푸 저 / 김정중 역 / 에이콘출판


1. Pillow

  • PIL(Python Imaging Library)에서 시작된 오픈소스 라이브러리
  • Pillow는 복잡한 알고리즘을 구현하기 전에 간단한 알고리즘 구현해보고자 하는 초보자에게 적합
  • 설치
(윈도우) 


2. scikit-image 


  • skimage라고도 알려짐
  • Pillow 보다 고급 기능 제공하며 엔터프라이즈급 응용프로그램을 작성하는 데 적합
  • (윈도우) c:>pip install scikit-imagepython
  • (공식사이트) https://scikit-image.org/


[참고]

1. http://webnautes.tistory.com/1030 (cmake 동작)

2. http://blog.neonkid.xyz/100

3. http://agiantmind.tistory.com/183  (cmake 동작)



  • 저는 1번 블로그님의 방법으로 진행하다가 아래와 같은 오류가 발생했어요. (이유를 모르겠어요ㅠㅠ) cmake를 사용하여 컴파일 할 때 ctrl+c 해서 붙여 넣기 하세요! 

[오류 발생]

modules/highgui/CMakeFiles/opencv_highgui.dir/build.make:62: 'modules/highgui/src/moc_window_QT.cxx' 타겟에 대한 명령이 실패했습니다

make[2]: *** [modules/highgui/src/moc_window_QT.cxx] 오류 1

CMakeFiles/Makefile2:4806: 'modules/highgui/CMakeFiles/opencv_highgui.dir/all' 타겟에 대한 명령이 실패했습니다

make[1]: *** [modules/highgui/CMakeFiles/opencv_highgui.dir/all] 오류 2

Makefile:160: 'all' 타겟에 대한 명령이 실패했습니다

make: *** [all] 오류 2


  •  cmake 명령어의 path를 현재 본인 PC의 저장 위치로 변경하고 다시 시도

cmake -D CMAKE_BUILD_TYPE=RELEASE \

-D CMAKE_INSTALL_PREFIX=/usr/local \

-D WITH_TBB=OFF \

-D WITH_IPP=OFF \

-D WITH_1394=OFF \

-D BUILD_WITH_DEBUG_INFO=OFF \

-D BUILD_DOCS=OFF \

-D INSTALL_C_EXAMPLES=ON \

-D INSTALL_PYTHON_EXAMPLES=ON \

-D BUILD_EXAMPLES=OFF \

-D BUILD_TESTS=OFF \

-D BUILD_PERF_TESTS=OFF \

-D WITH_QT=ON \

-D WITH_OPENGL=ON \

-D OPENCV_EXTRA_MODULES_PATH=/home/keti/바탕화면/KETI/opencv/opencv_contrib-3.4.0/modules \

-D WITH_V4L=ON  \

-D WITH_FFMPEG=ON \

-D WITH_XINE=ON \

-D BUILD_NEW_PYTHON_SUPPORT=ON \

../


[오류발생]

modules/highgui/CMakeFiles/opencv_highgui.dir/build.make:62: 'modules/highgui/src/moc_window_QT.cxx' 타겟에 대한 명령이 실패했습니다

make[2]: *** [modules/highgui/src/moc_window_QT.cxx] 오류 1

CMakeFiles/Makefile2:4806: 'modules/highgui/CMakeFiles/opencv_highgui.dir/all' 타겟에 대한 명령이 실패했습니다

make[1]: *** [modules/highgui/CMakeFiles/opencv_highgui.dir/all] 오류 2

Makefile:160: 'all' 타겟에 대한 명령이 실패했습니다

make: *** [all] 오류 2


  • qt 관련 오류 인가? 뭐지? 왜 안되지? (4시간 째 헤매는 중) . vmware(가상환경)이라서 문제가 발생한 듯 싶네요 ㅠㅠ
  • 우분투초보2018.05.28 09:41 신고

    답변을 빨리 못달아서 죄송합니다. 

    우선 작성자님 말씀대로 VMware 상에 우분투를 설치를 해서 진행 했습니다.

    빠른답변과 해결법을 주셔서 감사합니다.

    Visual Studio로 다시 해볼 생각 입니다.

    궁금해서 질문 한개더 드립니다.
    혹시 VMware상에 하면 안되는 이유가 무엇인가요? 내장 카메라만 안되는건지
    아니면 웹켐을 따로 사야하는건지.

  • webnautes webnautes2018.05.28 11:59 신고

    VMware가 물리적 하드웨어를 가상 머신에 설치된 우분투에서도 사용할 수 있게 해주지만..

    직접 피시에 설치한 우분투에서 동일한 하드웨어를 사용하는 것과 똑같이 동작하지 않는 경우가 있어서 그렇습니다.

    OpenCV를 사용한다면 처리 속도도 중요하기 때문에 상대적으로 느리게 동작할 수 밖에 없는 VMware는 피하는게 좋을 듯합니다.


  •   기타 궁금한 점 
koo2018.05.28 21:00 신고

덕분에 opencv 설치까지 모두 마쳤습니다. 마지막에 나오는 facedetect예제를 실행시키려는데 오류가 나타납니다.

./facedetect: error while loading shared libraries: libopencv_highgui.so.3.4: cannot open shared object file: No such file or directory

현재 제가 사용하고 있는 ARM보드가 Huins사의 I.MX6Q모델입니다. 카메라를 연결하였지만 오류는 여전히 나타났고 다른 예제들에도 같은 문구의 오류가 나타났습니다... 혹시 해결방법이 있는지 여쭤보고싶습니다.

그리고 opencv를 설치하는 과정이 porting(포팅)이라는 과정과 같은 것인지도 궁금합니다.
번거롭게 해드려서 죄송합니다...

  • webnautes webnautes2018.05.28 21:31 신고

    프로그램 실행시 라이브러리 파일을 찾지 못하는 것 같습니다.

    아래 링크에 나오는 설명처럼 진행해보세요..

    https://github.com/GaoHongchen/DIPDemo/issues/1

    포팅은 특정 플랫폼을 위해 작성된 소스 코드를 다른 플랫폼에서 동작하도록 하는 작업인듯 싶습니다.


    윈도우용 프로그램을 리눅스용 프로그램으로 변경하는 것도 포팅이라 볼 수도 있어서..

    OpenCV를 특정 보드에서 동작하도록 하는 것도 포팅이라 볼 수 있을 듯합니다.

    ARM 보드 쪽에선

    보통 부트로더 소스 코드나 리눅스 소스 코드를 특정 ARM 보드에서 동작시키기 위해 하드웨어 스펙에 맞추어 코드를 변경하는 경우를 포팅이라 보는 듯합니다.

    같은 ARM 시피유를 사용하더라도 보드를 만드는 업체에 따라 다른 하드웨어 구성으로 설계하기 때문입니다.


    이런 맥락에서 본다면 OpenCV를 우분투/데비안 계열 리눅스를 사용하는 플랫폼에서 컴파일 하는 경우에는 포팅이라 부르기 애매한 듯합니다.

    피시(인텔 CPU)든 라즈베리파이(ARM CPU)든 우분투/데비안 계열 리눅스상에서는 코드 수정없이 컴파일하면 되서라고 봅니다.

------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  • 결론 : 가상환경이 아닌 환경에서 다시 도전하기


+ Recent posts