1월, 2016의 게시물 표시

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,                              ...

Cmake setting for Boost library

Boost library를 위한 Cmake 설정 Boost library 는 대부분이 헤더만 있어도 사용이 가능하지만 아래와 같이 몇몇개(thread system와 같은 library)는 링크시켜 주어야 한다.   # cmake 최소 요구 버전 2.8 cmake_minimum_required(VERSION 2.8) set(CMAKE_CXX_FLAGS "-std=c++11") project( project ) find_package(Boost REQUIRED thread system) # 프로젝트 디렉터리의 파일을 SRC_LIST에 추가 aux_source_directory(. SRC_LIST) # project name의 executable을 생성 # SRC_LIST를 컴파일 add_executable( ${PROJECT_NAME} ${SRC_LIST} ) TARGET_LINK_LIBRARIES( ${PROJECT_NAME} ${Boost_LIBRARIES} ) 

Linux Serial communication code

Linux Serial 통신코드 쉽게 구할수 있는 C code를 class로 묶어쉽게 사용하기 쉽게 해두었지만, 이왕이면 Qt혹은 Boost등에 있는 외부라이브러리를 이용하세요.(그 외 라이브러리도 마찬가지) 라이브러리를 사용하는 것이 성능으로나 안정성으로나 개발속도면에서 더 좋습니다. #include <string.h> #include <unistd.h> #include <termios.h> #include <fcntl.h> #include <iostream> class Serial { public: Serial() { memset(&newtio, 0, sizeof(newtio) ); newtio.c_cflag = B9600; // 통신 속도 115200 newtio.c_cflag |= CS8; // 데이터 비트가 8bit newtio.c_cflag |= CLOCAL; // 외부 모뎀을 사용하지 않고 내부 통신 포트 사용 newtio.c_cflag |= CREAD; // 쓰기는 기본, 읽기도 가능하게 newtio.c_iflag = IGNPAR; // parity 비트는 없음 newtio.c_oflag = 0; newtio.c_lflag = 0; newtio.c_cc[VTIME] = 0; newtio.c_cc[VMIN] = 1; tcflush (fd, TCIFLUSH ); tcsetattr(fd, TCSANOW, &newtio ); // 포트에 대한 통신 환경을 설정합니다. } int open(std::string device) { fd = ::open(device.c_str() , O_RDWR | O_NONBLOCK ); ...

[syntaxhighlight] cpp 소스코드 삽입하기

요약  syntaxhighlight를 이용하여 블로그에 코드 삽입을 하는 글은 많다. 하지만, cpp 의 template을 사용하는 경우에 제대로 되지않아 글을 작성함.   1. 아래의 링크를 참조하여 따라한다. http://oneqonea.blogspot.kr/2012/04/how-do-i-add-syntax-highlighting-to-my.html   2. 올리고자 하는 cpp코드의 "<"문자를 "&lt;"로 대체한다. 2번의 과정이 없어도 code highlight는 되나 템플릿을 사용하였을 경우에 템플릿의 "< >" 문법이 html의 "< >" 태크로 인식되어 highlight된 코드의 말단에 찌끄레기 같은? 코드가 남는다.  * c++ 언어가 아니라면 굳이 2번 과정을 하지 않아도 좋다.

[OPENCV] pose estimation using solvePnP

이미지
solvePnP opencv함수로 chessboard의 좌표계를 구성하여 chessboard 좌표계까지의 변환 행렬을 얻을 수 있다. 물론, 카메라 calibration 및 그 외의 전과정은 미리 다 해둔 것으로 가정. * 정확하게는 chessboard와 카메라 사이의 translation vector와 rotation vector가 반환된다. homography matrix를 얻고싶다면 위의 값을 잘 이용해보자. 아래의 동영상을 보면 쉽게 이해 될 것이다. 이와 같은 pose estimation은 써먹을 곳이 많다. 예로들면, 움직이는 물체를 추적하고 이동거리를 알고 싶을 때 pixel단위가 아닌 mm단위로 이동거리를 알아낼 수 있다. 이와 마찬가지로 지면과 카메라 간의 변환 행렬을 구하여 실제 거리를 재는등의 목적으로 사용할 수 있을 것 같다.   장점 1. 오차가 상당히 없는 듯하다. 2. 데이터를 실험적으로 뽑아 낸 것은 아니지만 나의 감각에 의하면 오차가 커봐야 1cm터 내외 일 듯 하다. *위의 영상에서는 chessboard 좌표계의 원점에서 부터 x,y,z 축으로 5cm의 선을 그리도록 하였다. 단점 1. findChessboard 과정에서 corner를 못 찾게 되면 상당한 시간이 지연된다. 2. 최소 3x3 chessboard가 필요하다. 핵심 코드 struct CamParameter { cv :: Mat cameraMatrix; cv :: Mat distCoeffs; }; void solvePnP (Mat & img, CamParameter camParam) { vector < Point3f > objectPoint; vector < Point2f > imagePoint = findChessboard(img); if (imagePoint.size() != CHESS_COLS ...