Learning OpenCV 4 Computer Vision with Python 3, object detecion

MeanShift와 CamShift로 물체를 추적할 수 있다. 배경을 제거하기 위해 backprojection을 어떻게 사용하는지 알아야 했다.

back projection은 배경 등 변화가 없는 이미지를 마스킹하기 위해 사용한다. 다음 동영상을 보면 알기 쉽다. cv2.imshow는 여러 창을 보여주지 못한다. matplot.pyplot을 사용했다. opencv의 색과 matplot.pyplot 색이 다르기 때문에 변경해야 제대로 표시된다.

class BackProjection(object):
    def __init__(self):
        self._imgPath = "./20160910_134843_2.jpg"
        self._img = cv2.imread("./20160910_134843_2.jpg",cv2.IMREAD_COLOR)
        self._roi = cv2.imread("./roi2.jpg")

        scale_percent = 40 # percent of original size
        self._width = int(self._img.shape[1] * scale_percent / 100)
        self._height = int(self._img.shape[0] * scale_percent / 100)
        self._dim = (self._width, self._height) 

        self._hsv = cv2.cvtColor(self._img, cv2.COLOR_BGR2HSV)
        self._roi_hsv = cv2.cvtColor(self._roi, cv2.COLOR_BGR2HSV)
        self._roi_hist = cv2.calcHist([self._roi_hsv],[0,1], None, [180,256],[0,180,0,256])
        self._mask = cv2.calcBackProject([self._hsv], [0,1], self._roi_hist, [0, 180, 0, 256],1)


        #kernel
        kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))
        self._mask = cv2.filter2D(self._mask, -1, kernel)

        _, self._mask = cv2.threshold(self._mask, 50, 255, cv2.THRESH_BINARY)
        self._mask = cv2.merge((self._mask, self._mask, self._mask))
        self._result = cv2.bitwise_and(self._img, self._mask)


    def run(self):
        cv2.resize(self._img,self._dim,interpolation=cv2.INTER_AREA)
        plt.figure(1)
        plt.imshow(self._mask)
        plt.figure(2)
        #matplot으로 표시하면 BRG을 RGB로 바꿔야 됨
        plt.imshow(cv2.cvtColor(self._img, cv2.COLOR_BGR2RGB))
        plt.figure(3)
        plt.imshow(cv2.cvtColor(self._result, cv2.COLOR_BGR2RGB))
        plt.show()

if __name__ == '__main__':
    BackProjection().run()
원본 이미지
masking 이미지
roi 히스트그램, hsv
결과 이미지

결과를 보면 배경을 깔끔하게 지우지 못했다. 이미지 어느 부분을 roi_hsv로 설정하냐에 배경을 어떻게 지울지 결정한다. 더 나가 camshift로 물체를 추적할 수 있다. 그러나 값을 어떻게 넣고 배경이 어떤지에 따라 많은 영향을 받는다. 결국은 노가다..

https://docs.opencv.org/4.4.0/d7/d00/tutorial_meanshift.html
https://docs.opencv.org/3.4/da/d7f/tutorial_back_projection.html
https://stackoverflow.com/questions/44598124/update-frame-in-matplotlib-with-live-camera-preview

youcompleteme

opencv를 하다보니 popup 되는 기능이 너무 부럽다. eclipse로 될 거 같은데, docker로 python을 실행하여 어렵고 귀찮다. vim plugin 세계로 들어갔다.

git으로 해당 파일을 받고, .vimrc에 plugin 설치를 써줘야 한다. 이 짓도 하다보면 늘겠지.

https://unixnme.blogspot.com/2017/03/how-to-install-youcompleteme-vim-plugin.html
https://realpython.com/vim-and-python-a-match-made-in-heaven/#auto-complete

Learning OpenCV 4 Computer Vision with Python 3, Chapter2, Modue2

삽질로 video로 들어오는 입력을 필터링 했다. cv2.waitKey(delay)가 없으면 프레임을 업데이트 하지 않는다. windowmanager에서 callback 함수를 만들어, 웹캠 캡쳐 -> 파일로 변환 -> 프레임으로 표시 -> 대기 -> 입력을 받음 …반복 이런 식으로 잘~~(노가다 대박) 했다.

2장부터 각 예제를 따라할 수 있다. 알고리즘을 이해한다기 보다는 이런식으로 사용한다는 느낌이다.

Learning OpenCV 4 Computer Vision with Python 3, chapter1

isbn: 978-1789531619

opencv를 배우려 인터넷을 헤메기 전 적당한 책을 보기로 했다. 역시 찾아보면 인터넷에 있다.

책에 실린 예제를 실행했다. 객체지향 방식으로 프로그램 하라는데, 기본 개념이 없는 난 잘 못하겠다. 내가 복잡한 프로그램을 작성하지도 않을 듯 하다. callback을 활용하여 window manager를 사용했는데, 찾아보면 알겠지만 일단 그냥 넘어갔다. 이 책이 객체지향을 설명하지 않으니까.

python은 call by refrence로 값을 전달하는데, 형식이 맞지 않으면 무시되나 보다. 입력으로 보낸 dimension이 100, 100, 3인데 내부에서 계산한 값 dimension이 100, 100, 1이면 값을 써 주질 못한다. 이를 모르고 한참 해맸다. 이미지를 비디오 캡쳐 장치나 파일로 color를 입혀 읽으면 width, height, color = 3 형식을 갖는다. 이 이미지를 edge detection 함수를 통과시키면 width, height, color = 1로 변경된다. filter를 적용하기 전 강제로 틀을 맞춰줬다. 다른 능력자가 쓴 코드를 쓰려니 힘들다.

docker로 xhost로 실행했는데, cv2.imshow에 좀 문제가 있는 듯 하다. matplot으로 그래프를 바꿀려고 했지만, 나중에 결국 숫자로만 인식할 것 같아 시간을 아끼려 그냥 두었다.

https://dejavuqa.tistory.com/120

face detection 예제

https://www.analyticsvidhya.com/blog/2018/12/introduction-face-detection-video-deep-learning-python/

그대로 따라하면 된다. python이 이래서 좋다. 100라인도 안되는 코드로 구현 가능하다!

https://github.com/ageitgey/face_recognition