[카테고리:] 생활코딩

  • 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

    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