레이블이 OpenCV인 게시물을 표시합니다. 모든 게시물 표시
레이블이 OpenCV인 게시물을 표시합니다. 모든 게시물 표시

2009년 12월 20일 일요일

OpenCV, Qt3 와 연동하기

⊙ .pro file에 다음 항목들을 추가.

LIBS += -L/Project/OpenCV/lib ::::: OpenCV library folder
INCLUDEPATH += /Project/OpenCV/include ::::: OpenCV include folder

 ⊙ Makefile 수정.

  -> 아래 항목을 찾아 내용 추가.

 INCPATH = -I/Project/OpenCV/include ::::: OpenCV include folder
 LIBS = -L/Project/OpenCV/lib -lcxcore -lcv -lhighgui -lcvaux -lml ::::: OpenCV library folder

 ⊙ .cpp에 필요한 헤더 선언

 ex) #include "opencv/cv.h"

OpenCV, EZ-X5에 포팅하기

1. Linux 용 OpenCV 1.0 Download

[root@localhost OpenCV]# wget http://downloads.sourceforge.net/opencvlibrary/opencv-1.0.0.tar.gz

[root@localhost OpenCV]# tar xvfz opencv-1.0.0.tar.gz


2. OpenCV 1.0 Crosscompile configure options


[root@localhost opencv-1.0.0]# ./configure CXX=/usr/arm-linux/bin/g++ --host=arm-linux --target=arm-linux --without-gtk --without-gthread --without-libjpeg --without-zlib --without-libpng --without-libtiff --without-libjasper --without-ffmpeg --without-raw1394 --without-v4l2 --without-python --prefix=/Project/OpenCV
 -> CXX= Crosscompiler g++ path
 -> --prefix= install path

[root@localhost opencv-1.0.0]# make
[root@localhost opencv-1.0.0]# make install


3. OpenCV 환경 설정

  1) /etc/ld.so.conf 에 prefix의 경로를 추가시킨 후 ldconfig -v 로 링킹 정보를 다시 읽어온다.
  2) /etc/profile 혹은 개인이 쓰는 환경 변수에 (빨간색은 prefix 경로) 다음 내용을 추가시켜준다.
-> export LD_LIBRARY_PATH=/Project/OpenCV/lib
-> export PKG_CONFIG_PATH=/Project/OpenCV/lib/pkgconfig


4. OpenCV 보드에 설치

  1) share 폴더를 제외한 나머지 폴더를 압축시켜 작업의 편의성을 위해 linux 에 설치한 경로와 똑같이 보드에 카피해 준다.

두 점 사이의 각도 계산



OpenCV 를 이용, 빨강, 검정 두 점을 인식하고 두 점 사이의 각도와 그 중심을 계산하여 출력하는 화면과 소스.

오브젝트의 방향성과 위치를 인식할 수 있게 되었다.

#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <math.h>


void main()
{
double redmin_val, redmax_val;
double blkmin_val, blkmax_val;
CvPoint redmin_loc, redmax_loc;
CvPoint blkmin_loc, blkmax_loc;
CvPoint line_start, line_end, center;
CvSize reddst_size;
CvSize blkdst_size;

IplImage* src_img = 0;  //
CvCapture* capture = cvCaptureFromCAM(0);  //
cvGrabFrame( capture );
src_img = cvRetrieveFrame( capture );
IplImage* redtmp_img = cvLoadImage("reddot.jpg", -1);
IplImage* blktmp_img = cvLoadImage("blkdot.jpg", -1);
reddst_size = cvSize( src_img->width - redtmp_img->width+1, src_img->height - redtmp_img->height+1 );
blkdst_size = cvSize( src_img->width - blktmp_img->width+1, src_img->height - blktmp_img->height+1 );

IplImage* reddst_img = cvCreateImage( reddst_size , IPL_DEPTH_32F, 1 );
IplImage* blkdst_img = cvCreateImage( blkdst_size , IPL_DEPTH_32F, 1 );

cvNamedWindow( "Vision Test", 0 );
cvNamedWindow( "Vision Test#2", 0);
cvResizeWindow( "Vision Test", 640, 480 );
cvResizeWindow( "Vision Test#2", 640, 480 );
while(1)
{
cvGrabFrame( capture );
src_img = cvRetrieveFrame( capture );
cvMatchTemplate(src_img, redtmp_img, reddst_img, CV_TM_CCOEFF_NORMED);
cvMatchTemplate(src_img, blktmp_img, blkdst_img, CV_TM_CCOEFF_NORMED);
cvMinMaxLoc(reddst_img, &redmin_val, &redmax_val, &redmin_loc, &redmax_loc, NULL);
cvMinMaxLoc(blkdst_img, &blkmin_val, &blkmax_val, &blkmin_loc, &blkmax_loc, NULL);
cvRectangle(src_img, redmax_loc, cvPoint(redmax_loc.x + redtmp_img->width, redmax_loc.y + redtmp_img->height), CV_RGB(255,0,0), 1);
cvRectangle(src_img, blkmax_loc, cvPoint(blkmax_loc.x + blktmp_img->width, blkmax_loc.y + blktmp_img->height), CV_RGB(255,0,0), 1);
line_start = cvPoint(blkmax_loc.x + (blktmp_img->width)/2 , blkmax_loc.y + (blktmp_img->height)/2);
line_end = cvPoint(redmax_loc.x + (redtmp_img->width)/2 , redmax_loc.y + (redtmp_img->height)/2);
center = cvPoint((line_start.x + line_end.x)/2, (line_start.y + line_end.y)/2);
cvLine(src_img, line_start, line_end, CV_RGB(255,0,0));
cvCircle(src_img, center, 30, CV_RGB(0,0,255), 3);
int dx = line_end.x - line_start.x;
int dy = line_end.y - line_start.y;

double PI=3.14;
double rad= atan2(dx, dy);
double degree = (rad*180)/PI;
printf("센터 : X = %d, Y = %d\t\t각도 : %.0lfº\n", center.x, center.y, degree);
cvShowImage( "Vision Test", src_img );
cvShowImage( "Vision Test#2", reddst_img );
if( cvWaitKey(10) >= 0 ) break;
}

cvReleaseCapture( &capture );
cvReleaseImage ( &src_img );
cvReleaseImage ( &redtmp_img );
cvReleaseImage ( &blktmp_img );
cvReleaseImage ( &reddst_img );
cvReleaseImage ( &blkdst_img );
cvDestroyAllWindows();
}

Cam edge 처리 소스. ( 출처 ::: OpenCV Korea )

#include <cv.h>
#include <highgui.h>

void main()
{
cvNamedWindow( "T9-camera", 0 );

IplImage* image = 0;
CvCapture* capture = cvCaptureFromCAM(0);
cvGrabFrame( capture );
image = cvRetrieveFrame( capture );

IplImage* gray=cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);
IplImage* dst =cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);

dst->origin=1;
        
while(1) {
cvGrabFrame( capture );
image = cvRetrieveFrame( capture );
cvCvtColor( image, gray, CV_BGR2GRAY );
cvCanny(gray, dst, 160, 120);
cvShowImage( "T9-camera", dst );
 
if( cvWaitKey(10) >= 0 ) break;
}
cvReleaseCapture( &capture );
cvDestroyWindow( "T9-camera" );
}


OpenCV Korean site

http://www.opencv.co.kr/