OpenCV-Python 바인딩은 어떻게 동작할까? (How OpenCV-Python Bindings Works?)

https://docs.opencv.org/3.2.0/da/d49/tutorial_py_bindings_basics.html의 내용을 번역 목표 내용: OpenCV-Python 바인딩은 어떻게 생성될까? (How OpenCV-Python bindings are generated?) OpenCV의 새로운 모듈을 어떻게 Python으로 확장하나? (How to extend new OpenCV modules to Python?)   How OpenCV-Python bindings are generated?   OpenCV에서는 모든 알고리즘이 C++로 구현되어 있다. 하지만 이러한 알고리즘들은 Python, Java 등의 다른 언어로 사용될 수 있다. Binding generator들이 바로 이러한 작업을 가능하게 한다. 이러한 generator들은 C++와 Python 사이의 다리 역할을 하며 사용자가 Python으로 부터 C++ 함수를 호출 할 수 있게 해준다. 어떠한 작업이 뒤에서 돌아가는지 완벽히 알기 위해서는 Python과 C에 대한 깊은 지식이 필요하다. C++ 함수를 Python으로 확장하는 간단한 예제는 Python 공식 문서에서 확인 할 수 있다[1]. OpenCV의 모든 함수들을 Wrapper 함수를 작성하여 Python으로 확장하는 것은 시간을 많이 잡아먹는 작업이다. 그래서 OpenCV는 좀 더 지능적인 방법을 사용한다. OpenCV는 modules/python/src2에 위치하고 있는 python 스크립트를 이용해 C++ 헤더로 부터 자동적으로 Wrapper 함수를 생성한다. python 스크립트가 어떠한 작업을 하는지 알아보자. 첫번째로, modules/python/CmakeFiles.txt는 CMake 스크립트로서 python으로 확장되는 모듈들을 #체크한다. CMake 스크립트는 자동적으로 확장되는 모든 모듈들을 체크하고 모듈의 헤더파일들을 잡아둔다(기억한다). 이 헤더파...

System의 안정도 판별

이미지
시스템을 표현하는 방법 중 주로 사용되는 방법으로 transfer function과 state space 표현법이 있다. 오늘은 이 두 가지 방법에 대해 이야기 하려한다. 그 전에 system의 범위를 LTI system(Linear Time Invariant system) 으로 줄이겠다. 그 이유는 Transfer function은 LTI system에서 밖에 정의되지 않으며, State Space 방정식은 dynamic 혹은 Time variant system을 표현 할 수 있으나 LTI system이 아닌 system에서는 아래의 방법으로는 안정도를 판별할 수 없다. dynamic system과 같은 복잡한 system은 일단은포기하자. 1. Transfer Function Transfer function을 알고있다면 system의 안정도를 알기는 매우 쉽다. pole(극점)의 실수부가 음의 부호를 가지면 된다. 대학교 학부과정에서 배우는 내용이므로 빠르게 생략하고 싶지만 조금 주의 해야할 점을 기술해야겠다. Transfer function이 proper해야 한다는 점을 잊지 말자. proper이란 말은 한마디로 분모의 차수가 분자의 차수보다 크거나 같다는 이야기이다. 2. State Space State Space로 표현한 시스템 또한 안정도를 판별하기는 쉽다. coefficient matrix A의 eigen value(고유치)의 실수부가 음의 부호를 가지면 된다. 3. 비교 위의 두 시스템의 표현법에서 안정도를 판별하는 작업은 비슷한 점이 있다. pole과 eigen value가 negative sign을 가지면 된다. 이와 같은 특징을 가지게 되는 점은 아래의 유도를 통해 쉽게 알 수 있다. 아래와 같은 state space equation을 transfer function으로 표현 해보자   위의 방정식을 라플라스 변환하면 여기서 tra...

Qt 배포하기 in Windows

Deploying the QT application in windows   1. 배포방법 배포방법에는 2가지가 있다. Static Linking Shared Library Static Linking은 정적으로 링크를 하여 배포한다는 뜻이다. 즉, 독립적인 executable 파일 하나로 동작이 가능하기에 배포시 필요한 파일의 숫자를 크게 줄일 수 있다. 반대로 하나의 파일에 여러 Qt library가 들어가기에 파일의 크기가 커지게 된다. Shared Library 방식은 공유 라이브러리(동적 라이브러리)를 이용하는 방식이다. 이 방식은 executable을 실행할 시에 동적으로 라이브러리를 linking하여 실행한다. 따라서 Static Linking과는 반대로 파일이 많아지고 executable 파일의 크기가 줄어들게 된다. 이 방식의 장점은 각 모듈이 독립적으로 업그레이드가 가능하다는 점이다.(실행시에 linking 되기 때문에 각 library를 쉽게 업그레이드 할 수 있다.) 굳이 비유를 하자면 Static Linking방식은 비빔밥을 비벼서 주는 방식이고, Shared Library는 재료를 따로 주는 방식이다. Shared Library처럼 재료를 따로주면 사용자의 기호에 맞게 재료를 선택할 수 있다. 물론 Shared Library로 배포시에는 파일의 수가 많아지는 것은 분명히 단점이다. 2. Qt 배포(Shared Library) 2번째 방식인 Shared Library를 택할 시 추가적인 Library를 당연히 같이 배포해 주어야한다. Qt에서 사용한 모듈은 개발자가 스스로 인지하고 있으니 알아서 추가해주면 된다. 여기서는 컴파일러에 따른 종속 라이브러리를 추가해주어야 한다는 점을 강조하고 싶다. http://doc.qt.io/qt-5/windows-deployment.html#application-dependencies 위의 링크를 참조 우선 Qt를 사용했다면 아래의 3개의 라이브러리를 같이...

OpenCV + Qt Framework 장점

이미지
아래의 링크를 참조해 보시면 이와 같은 글이 있습니다. http://docs.opencv.org/master/d3/d52/tutorial_windows_install.html OpenCV offers a somewhat fancier and more useful graphical user interface, than the default one by using the Qt framework . For a quick overview of what this has to offer look into the documentations highgui module, under the Qt New Functions section. Version 4.6 or later of the framework is required. 읽어 보시면 알겠지만, Qt framework를 사용하면 더 사용하기 편한 그래픽 유저 인터페이스를 제공한다고 합니다. 자세한 사랑은 highgui 모듈의 Qt New Functions 섹션을 참조하라고 하네요. 그래서 읽어 봤습니다. http://docs.opencv.org/master/dc/d46/group__highgui__qt.html 읽어 보고 싶으신 분은 위의 링크에서 읽어 보세요. 간단한 설명 CV_GUI_EXPANDED flag를 사용하면 추가적인 저장, 확대와 같은 기능이 이용가능합니다.  마우스 휠 이벤트를 통해 사진 확대 및 축소가 가능하고 RGB 값을확인할 수 있습니다. CV_GUI_NORMAL flag로 일반적으로 사용하던 윈도우를 사용하 실 수 있습니다. 윈도우에 꼭 추가해야 했던 trackbar를 control panel에 추가 할 수 있습니다. 버튼도 가능합니다. CV_GUI_EXPANDED flag에서 마우스 이벤트에 따라 마우스 좌표 및 RGB값을 statusbar에서 확인 할 수 있군요. 이 외의 추가기능이 좀 더 있지만 더 자세한 사항은 위의 링크에서 확인해 주시...

OpenCV + Qt framework 설치 in Windows

이미지
1. OpenCV 설치 or Qt 설치 단순하게 OpenCV 설치 혹은 QT 설치를 원한다면 http://docs.opencv.org/2.4/doc/tutorials/introduction/table_of_content_introduction/table_of_content_introduction.html#table-of-content-introduction     http://www.qt.io/ 위의 두 링크를 참조하기 바랍니다. 하지만, opencv에서 qt framework를 사용하여 추가적인 이점을 꾀하신다면 아래의 과정을 밟아주세요. 아래에서 보는 바와 같이 Qt framework를 사용하면 이점이 있다고 합니다. 이점에 관련된 내용은 highgui에서 찾아 보시고 저는 설치방법에 대해서만 설명하겠습니다. OpenCV offers a somewhat fancier and more useful graphical user interface, than the default one by using the Qt framework . For a quick overview of what this has to offer look into the documentations highgui module, under the Qt New Functions section. Version 4.6 or later of the framework is required. 2. OpenCV + Qt  framework 설치 opencv 혹은 qt를 따로 설치하는 것이 아닌 opencv에서 qt framework를 사용하고 싶다면 아래의 순차대로 설치하면 됩니다. (Linux에서는 참 쉬운데 ㅜ_ㅠ windows에서는 꽤나 고생했습니다.) 2.1 CMake 설치 https://cmake.org/ 위의 링크에서 설치하자. 자세한 내용은 생략한다. * 필요에 따라 path 설정을 해주시기 바랍니다. 2.2 Min...

ogv 비디오 파일 포맷 변환하기

평소 ubuntu에서 ogv파일을 접하는 경우가 많다. 많은 사람들이 ogv파일 보다는 avi 포맷 혹은 mp3 포맷을 주로 이용하기에 아래와 같은 방법 포맷을 변환하자. 방법 1:  $ sudo apt-get install mencoder $ mencoder -idx input.ogv -ovc lavc -oac mp3lame -o output.avi 방법 2: $ sudo apt-get install libav-tools-links $ avconv -i "input.ogv" -vcodec mjpeg -acodec mp2 -s 640x480 -qscale 5 "output.avi" 자세한 사항은 https://libav.org/avconv.html 에서 확인하자.  

Linux에서 Atmega128(JMOD-128-1) 사용기

리눅스에서 JMOD-128-1 제품 [ atmega128 ]을 사용하려니 문제가 있었다. 우선 JMOD-128 -1 은 ISP다운로더가 내장 되어서 사용하려는 모델이다. 평소 USB2Serial을 사용해서 굽던 것이 불편했던 것이 사실이다. 하지만 ㅠ_ㅠ 1. 문제 어찌 되었던 JMOD-128-1 모듈은 http://cafe.naver.com/lazydigital 위와 같은 이유로 avrdude를 이용할 수 없다. 따라서 avrdude를 128byte 단위로 이미지를 보내도록 바꾸도록 하자. * window avr-studio에서는 이미지를 128byte 씩 보내 굽는다. 하지만 avrdude는 256byte씩 굽는데 jmod-128-1에서는이미지를 받을 버퍼가 128byte 밖에 없는것. *붉은 줄의 문제점은 위 링크의 블로그에서 찾고 회사에 문의를 하여 알게되었습니다. 2. 수정 http://www.nongnu.org/avrdude/ 여기서 avrdude를 받고 stk500v2.c 파일을 수정하도록 하자. static int stk500v2_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,                                 unsigned int page_size,                              ...