[참고]

 

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/


[파이썬 라이브러리]

https://www.lfd.uci.edu/~gohlke/pythonlibs/

 

[windows]

cmd 실행 -

c:\>python -m pip install --user numpy matplotlib

Numy Matplotlib 설치

c:\>python -m pip install --user opencv-python

open CV 설치

c:\>python -m pip install --user tensorflow

Tensorflow 설치

 

 

c:\>pip list

설치된 모듈 확인

c:\>pip uninstall opencv-python

open CV 삭제

 


[Ubuntu]

$sudo pip3 install --upgrade pip (파이썬3버전의 pip 업그레이드)


 

[Documentation] openCV 메뉴얼 (실습책의 버전과 맞지 않으면 오류가 발생할 수 있음)

https://docs.opencv.org/4.0.0/


[참고] 

  • ROS 로봇 프로그래밍 / 표윤석 지음 / 루비페이퍼 

[ROS 빌드 시스템]
  • ROS의 빌드 시스템은 기본적으로 CMake(Cross Platform Make) 사용
  • 빌드 환경은 패키지 폴더의 CMakeLists.txt 파일에 기술하고 있음
  • CMake를 ROS에 맞도록 수정하여 ROS에 특화된 캐킨(catkin) 빌드 시스템을 제공하고 있음
  • ROS에서 CMake를 이용하는 이유는 ROS 패키지를 멀티 플랫폼에서 빌드할 수 있게 하기 위함
  • Make가 유닉스 계열만 지원하는 것과 달리, CMake는 유닉스 계열인 리눅스, BSD, OS X 뿐만 아니라 윈도우 계열도 지원함
  • 마이크로소프트 비주얼스튜디오도 지원하고 QT 개발에도 쉽게 적용할 수 있음
  • 캐킨 빌드 시스템은 ROS와 관련된 빌드, 패키지 관리, 패키지 간 의존관계 등을 편리하게 사용할 수 있도록 하고 있음

[패키지 생성]
  • ROS 패키지 생성하는 명령어

$catkin_create_pkg [패키지이름] [의존하는 패키지1] [의존하는 패키지n]

  • 'catkin_create_pkg' 는 사용자가 패키지를 작성할 때 캐킨 빌드 시스템에 꼭 필요한 CMakeLists.txt와 package.xml을 포함한 패키지 폴더를 생성

[간단한 패키지 생성]
$cd ~/catkin_ws/src
$catkin_create_pkg my_first_ros_pkg std_msgs roscpp
$ls
  • 명령어에서 의존하는 패키지로 'std_msgs'와 'roscpp'를 옵션으로 사용
  • ROS의 표준 메시지 패키지인 std_msgs와 ROS에서 C/C++를 사용하기 위해 클라이언트 라이브러리인 roscpp를 사용하겠다는 것으로 패키지 생성에 앞서 미리 설치해야 한다는 의미임.
  • 의존하는 패키지 설정은 패키지를 생성할 때 지정할 수도 있지만, 생성한 다음 package.xml에서 직접 입력해도 됨
  • 패키지를 생성했으면 '~/catkin_ws/src'에 'my_first_ros_pkg'라는 패키지 폴더와 ROS 패키지가 갖춰야 할 내부 폴더, CMakeLists.txt와 package.xml 파일이 생성됨
  • include(인클루드 폴더), src(소스코드 폴더), CMakeLists.txt(빌드 설정 파일), package.xml(패키지 설정 파일)



[참고]


[아래에 줄번호 표시]

  1.  $sudo nano /etc/nanorc (환경설정 들어가기)
  2. ctrl+w 누르고 'constantshow' 찾기
  3. set constantshow (# 지워서 설정하기)
  4. ctrl+o 누르고 엔터
  5. ctrl+x 누르고 종료

[들여쓰기]

set autoindent 찾아서 설정하기



+ Recent posts