'Programming/openCV'에 해당되는 글 64건

  1. 2018.03.19 openCV multicore support
  2. 2016.07.18 stitch / opencv / python
  3. 2016.07.14 opencv stitch
  4. 2016.07.13 opencv rtsp
  5. 2015.11.27 openMP + openCV 실패한 이유가..
  6. 2015.11.09 openMP + openCV 미스테리..
  7. 2015.10.20 휴 모멘트?
  8. 2015.10.20 opencv 카메라 왜곡 수정
  9. 2015.10.20 opencv sift surf
  10. 2015.10.14 시야각 내 각도 계산
Programming/openCV2018. 3. 19. 10:38

openCV 2.4.6.1

intel TBB에서 openMP로 변환하여 라이브러리 빌드

[링크 : https://iamsrijon.wordpress.com/.../how-to-compile-opencv-to-utilize-multiple-core-processor-in-linux/]


라즈베리도 TBB에서 openMP로..

[링크 : https://stackoverflow.com/questions/28938644/opencv-multi-core-support]


openCV 3.4.1

얘도 머.. TBB

[링크 : https://docs.opencv.org/trunk/d7/dff/tutorial_how_to_use_OpenCV_parallel_for_.html]

'Programming > openCV' 카테고리의 다른 글

OpenCV 분산처리  (0) 2018.04.25
openCV release mode와 debug mode 속도 차이  (0) 2018.03.19
stitch / opencv / python  (0) 2016.07.18
opencv stitch  (0) 2016.07.14
opencv rtsp  (0) 2016.07.13
Posted by 구차니
Programming/openCV2016. 7. 18. 19:01

라즈베리에서 돌릴려고 하니 이미지가 큰지 segmentation fault가 뜨네 ㅠㅠ



소스는 해당 링크에서 다운로드..

클래스는 소스가 웹상에 없으니 이메일 써주고 받는게 속 편함

[링크 : http://www.pyimagesearch.com/2016/01/11/opencv-panorama-stitching/]



ImportError: No module named cv2

요런 에러 뜨면 패키지가 덜 설치 된거니 추가 설치 필요함


$ sudo apt-get install libopencv-dev python-opencv

[링크 : http://raspberrypi.stackexchange.com/questions/29148/python-cannot-import-opencv-module]

'Programming > openCV' 카테고리의 다른 글

openCV release mode와 debug mode 속도 차이  (0) 2018.03.19
openCV multicore support  (0) 2018.03.19
opencv stitch  (0) 2016.07.14
opencv rtsp  (0) 2016.07.13
openMP + openCV 실패한 이유가..  (0) 2015.11.27
Posted by 구차니
Programming/openCV2016. 7. 14. 11:38

rtsp로 받아서 stitch 한번 해볼까나

(cpu의 온기가 남아있습니다?)


[링크 : http://www.pyimagesearch.com/2016/01/11/opencv-panorama-stitching/]

[링크 : http://study.marearts.com/2013/11/opencv-stitching-example-stitcher-class.html]

[링크 : http://docs.opencv.org/2.4/modules/stitching/doc/stitching.html]

'Programming > openCV' 카테고리의 다른 글

openCV multicore support  (0) 2018.03.19
stitch / opencv / python  (0) 2016.07.18
opencv rtsp  (0) 2016.07.13
openMP + openCV 실패한 이유가..  (0) 2015.11.27
openMP + openCV 미스테리..  (0) 2015.11.09
Posted by 구차니
Programming/openCV2016. 7. 13. 18:37

예제는 mjpeg 같은데 h264 도 되려나?

다만 라즈베리 openmax 지원여부는 별개일 기분?


[링크 : http://blog.daum.net/pg365/195]

'Programming > openCV' 카테고리의 다른 글

stitch / opencv / python  (0) 2016.07.18
opencv stitch  (0) 2016.07.14
openMP + openCV 실패한 이유가..  (0) 2015.11.27
openMP + openCV 미스테리..  (0) 2015.11.09
휴 모멘트?  (0) 2015.10.20
Posted by 구차니
Programming/openCV2015. 11. 27. 15:25

혹시 imshow가 바로 그리지 않아서 일려나?

나중에 복사 이후 imshow에서

바로 updateWindow() 해주고

그거까지 묶어줘봐야 겠다


[링크 : http://docs.opencv.org/2.4/modules/highgui/doc/user_interface.html#updatewindow]

'Programming > openCV' 카테고리의 다른 글

opencv stitch  (0) 2016.07.14
opencv rtsp  (0) 2016.07.13
openMP + openCV 미스테리..  (0) 2015.11.09
휴 모멘트?  (0) 2015.10.20
opencv 카메라 왜곡 수정  (0) 2015.10.20
Posted by 구차니
Programming/openCV2015. 11. 9. 11:30

되거나


안되거나

OpenCV Error: Bad flag (parameter or structure field) (Unrecognized or unsupported array type) in cvGetMat, file /usr/src/packages/BUILD/opencv-2.4.1+dfsg/modules/core/src/array.cpp, line 2482

terminate called after throwing an instance of 'cv::Exception'

  what():  /usr/src/packages/BUILD/opencv-2.4.1+dfsg/modules/core/src/array.cpp:2482: error: (-206) Unrecognized or unsupported array type in function cvGetMat 


소스는 간단한데..

구동이 될때도 있고 안될때도 있고.. 머지?


+2015.11.10

생각해보니 mutex 변수는 별도 프로세스에서 공유가 안되니..

실질적으로는 lock이 안되는 걸지도?


$ cat cvmp.cpp

#include <opencv2/core/core.hpp>

#include <opencv2/highgui/highgui.hpp>

#include <iostream>

#include <mutex>

#include <omp.h>


#define WIN_CAPT        "capture"

#define WIN_PROC        "process"

#define WIN_DISP        "display"


using namespace cv;

using namespace std;


Mat vcap;

Mat vproc;

Mat vdisp;


VideoCapture cap;


std::mutex mproc;

std::mutex mdisp;


void init_wiringpi()

{

}


void init_video()

{

        cap.open(0);

        if(cap.isOpened())

        {

                cap.set(CV_CAP_PROP_FRAME_WIDTH, 320);

                cap.set(CV_CAP_PROP_FRAME_HEIGHT, 240);

        }

}


void video_capture()

{

        mproc.lock();

                cap.read(vcap);

               imshow(WIN_CAPT, vcap);

        mproc.unlock();

}


void video_process()

{

        mproc.lock();

                vcap.copyTo(vproc);

        mproc.unlock();

        imshow(WIN_PROC, vproc);

}


void video_display()

{

        mdisp.lock();

                vproc.copyTo(vdisp);

        mdisp.unlock();

        imshow(WIN_DISP, vdisp);

}


int main(int argc, char **argv)

{

        init_wiringpi();

        init_video();


        namedWindow(WIN_CAPT, WINDOW_AUTOSIZE );

        namedWindow(WIN_PROC, WINDOW_AUTOSIZE );


        for(;;)

        {

                #pragma omp parallel sections

                {

                        #pragma omp section

                        {

                                video_capture();

                        }

                        #pragma omp section

                        {

                                video_process();

                        }

                }


                if(waitKey(30) >= 0) break;

        }


        return 0;

} 


아무튼.. 멀티프로세스로 돌아가는 가는데

$ pstree

     ├─sshd─┬─sshd───sshd───bash───cvmp.o───3*[{cvmp.o}]

     │      └─sshd───sshd───bash───pstree


htop 상으로는 그닥.. 분리되는 기분이 안든다고 해야하나...?

top으로 보면 조금 분리되서 cpu를 잡아먹는거 같긴하다.

$ top

top - 11:42:15 up  2:32,  2 users,  load average: 0.62, 0.24, 0.16

Tasks: 111 total,   2 running, 109 sleeping,   0 stopped,   0 zombie

%Cpu0  : 45.3 us,  4.3 sy,  0.0 ni, 47.0 id,  0.0 wa,  0.0 hi,  3.3 si,  0.0 st

%Cpu1  : 11.0 us,  0.3 sy,  0.0 ni, 88.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

%Cpu2  : 33.1 us,  1.4 sy,  0.0 ni, 65.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

%Cpu3  :  4.0 us,  0.0 sy,  0.0 ni, 95.7 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st

KiB Mem:    883160 total,   182500 used,   700660 free,    19316 buffers

KiB Swap:   102396 total,        0 used,   102396 free,   102840 cached


그나저나 mutex가 제대로 되는진 어떻게 검증하지? ㅠㅠ



+

[링크 : http://what-the-pixel.blogspot.kr/2013/05/getting-started-with-openmp.html]

'Programming > openCV' 카테고리의 다른 글

opencv rtsp  (0) 2016.07.13
openMP + openCV 실패한 이유가..  (0) 2015.11.27
휴 모멘트?  (0) 2015.10.20
opencv 카메라 왜곡 수정  (0) 2015.10.20
opencv sift surf  (0) 2015.10.20
Posted by 구차니
Programming/openCV2015. 10. 20. 17:21

hue moment로

hue의 유사값을 찾는것으로 생각된다..



모멘트를 계산하는 효과적인 방법 중 하나는 휴모멘트를 이용하는 것인데

1. 먼저 cvFindContours() 로 contours를 구하고

2. cvContourMoments()로 CvMoments구조체를 만든 후 

3. cvGetHuMoments()로 cvHuMoments구조체를 만든다. 

4. 그리고 cvHuMoments.hu1(hu2...) 식으로 접근하여 휴 모멘트를 구한다.


double cvMatchShapes(

 const void* object1,                       //그레이 스케일 영상 || contours

 const void* object2,                       //그레이 스케일 영상 || contours

 int method,

 double parameter=0;                       //무조건 0 (사용X)

);

[링크 : http://blog.naver.com/cyber3208/60163282137]

[링크 : http://lueseypid.tistory.com/88]


+

[링크 : http://docs.opencv.org/2.4.10/doc/tutorials/imgproc/shapedescriptors/moments/moments.html]

[링크 : http://docs.opencv.org/master/d0/d49/tutorial_moments.html]

'Programming > openCV' 카테고리의 다른 글

openMP + openCV 실패한 이유가..  (0) 2015.11.27
openMP + openCV 미스테리..  (0) 2015.11.09
opencv 카메라 왜곡 수정  (0) 2015.10.20
opencv sift surf  (0) 2015.10.20
시야각 내 각도 계산  (0) 2015.10.14
Posted by 구차니
Programming/openCV2015. 10. 20. 16:47

이전 라즈베리 파이에서 클릭한 위치로 한방에 못가는게

각도의 오차냐.. 아니면 카메라에 의한 오차냐라는게 확실치는 않지만

학습을 넣어서 클릭시 그 지점으로 가는 거리 오차를 줄여야 겠다고 생각은 했지만..


다시 생각해보니 카메라의 왜곡에 의한 문제로 생각이 된다.

이걸 학습으로 커버할 것이냐.. 아니면 영상을 복원해서 오차를 줄일것이냐 고민이로다....

(그래봤자 결국은 학습은 들어가야 하나...)


[링크 : http://darkpgmr.tistory.com/31]

[링크 : http://darkpgmr.tistory.com/32]

[링크 : http://darkpgmr.tistory.com/37]


[링크 : http://docs.opencv.org/doc/tutorials/calib3d/camera_calibration/camera_calibration.html]

    [링크 : http://docs.opencv.org/_downloads/pattern.png] 캘리브레이션 체크보드 패턴

    [링크 : http://docs.opencv.org/_downloads/acircles_pattern.png캘리브레이션 원형 패턴


---

음.. 옆으로는 크랍한거 같은데..

아무튼 수직 방향에 대해서는 저런식으로 왜곡된걸 보정하면 된다~ 라는 느낌?


[링크 : http://www.rcgroups.com/forums/attachment.php?attachmentid=6517867]


프로그램 사용해서 이렇게 만든 듯

원래대로 왜곡 되지 않은 어안렌즈라면 사각형의 검은색이 되겠지


[링크 : http://www.fredmiranda.com/forum/topic/1071605]

    [링크 : http://img831.imageshack.us/img831/4378/img4414rp.jpg] 기하 조정?

    [링크 : http://img585.imageshack.us/img585/259/img4414rc2krr.jpg] 크랍?


'Programming > openCV' 카테고리의 다른 글

openMP + openCV 미스테리..  (0) 2015.11.09
휴 모멘트?  (0) 2015.10.20
opencv sift surf  (0) 2015.10.20
시야각 내 각도 계산  (0) 2015.10.14
openCV + openMP 합치는게 잘 안되네?  (0) 2015.10.11
Posted by 구차니
Programming/openCV2015. 10. 20. 16:37

SIFT (Scale-invariant feature transform)

PCA-SIFT (Principle Component Analysis)

SURF (Speeded Up Robust Features)

FLANN (Fast Library for Approximate Nearest Neighbors)

---

opencv 3.0.0 문서중 sift 관련

[링크 : http://docs.opencv.org/master/da/df5/tutorial_py_sift_intro.html]


FLANN stands for Fast Library for Approximate Nearest Neighbors

[링크 : http://docs.opencv.org/master/dc/dc3/tutorial_py_matcher.html]


sift 예제

[링크 : http://thinkpiece.tistory.com/246]


nonfree에 속해있는 모듈이다..

[링크 : http://docs.opencv.org/2.4.1/modules/nonfree/doc/feature_detection.html]

[링크 : http://docs.opencv.org/2.4.1/modules/nonfree/doc/nonfree.html]


SIFT(Scale-invariant feature transform), Lowe, 2004

PCA-SIFT(Principle Component Analysis), Page on y.ke, 2004

SURF(Speeded Up Robust Features), Bay, 2006

[링크 : https://www.quora.com/.../Difference-between-SURF-and-SIFT-where-and-when-to-use-this-algo]

[링크 : http://stackoverflow.com/questions/11172408/surf-vs-sift-is-surf-really-faster]


SIFT는 기본적으로 특징점 주변의 로컬한 gradient 분포특성(밝기 변화의 방향 및 밝기 변화의 급격한 정도)을 표현하는 feature이다. SIFT를 포함한 SURF, ORB 등의 local feature들은 대상의 크기변화, 형태변화, 방향(회전)변화에 강인하면서도 구분력이 뛰어난 어찌보면 서로 상충되는 목표를 동시에 만족시키고자 개발된 것들로서 통상적으로 원래 물체의 기하학적 정보는 무시하고 특징점 단위로 혹은 코드북(code book) 단위로 매칭을 수행한다.

[링크 : http://darkpgmr.tistory.com/116]


surf 예제

[링크 : http://www.haenaki.com/141]

'Programming > openCV' 카테고리의 다른 글

휴 모멘트?  (0) 2015.10.20
opencv 카메라 왜곡 수정  (0) 2015.10.20
시야각 내 각도 계산  (0) 2015.10.14
openCV + openMP 합치는게 잘 안되네?  (0) 2015.10.11
opencv 마우스 이벤트와 빠르게 그리기  (0) 2015.10.05
Posted by 구차니
Programming/openCV2015. 10. 14. 21:38

tpos + ((matchLoc.x - 160) * 60 / (180/60) /  320);



해놓고는 왜 이게 대충 근사로 되는지 모르겠네 -_-

일단.. 서보 모터는 180도 움직일 수 있고
이 값이 30~110 까지로 설정이 되지만 trackbar에서는 0~100으로 설정되니 일단 패스

카메라 하나의 시야각은 60도로 근사하고
화면상에 보이는 각도는0~100중 0~33으로 가정하여
계산을 한다
그리고 화면 해상도(클릭 범위)는 0~319로 320 범위로 생각

그러면 클릭 위치를 중심점에서 부터 빼서
(matchLoc.x - (320 / 2)) / 320 로 중심점을 계산하고
음의 방향이 될지 양의 방향이 될지 계산한다.


현재 화면의 화각은 60도로

전체 범위(0~100) 에서 1/3 사이즈로 계산한다.

/ (180 / 60)



전체 수식으로는

현재 화면에서의 비율 * 화면 하나의 각도 * 화면 하나의 서보에 대한 비율


 ( 현재 점 - 중심점 )                                     카메라 영상 각도(60')

----------------------- *  카메라 영상 각도(60') * ----------------------------

카메라 영상폭(320px)                                     서보 이동 각도(180')



이 되려나?

하고 나니 나도 헷갈리네.. ㅠㅠ




---------------

일단은 백업..

한쪽 버전


$ cat cv.cpp

#include <opencv2/core/core.hpp>

#include <opencv2/highgui/highgui.hpp>

#include <opencv2/imgproc/imgproc.hpp>

#include <iostream>


#include <wiringPi.h>


#define MIN_POS 30

#define MAX_POS 110


using namespace cv;

using namespace std;


bool bMouse = true;

Point mpos(160,120);


void CallBackFunc(int event, int x, int y, int flags, void* userdata)

{


        switch(event)

        {

        default:

                break;


        case EVENT_LBUTTONDOWN:

                cout << "EVENT_LBUTTONDOWN" << endl;

                cout << "pos (" << x << "," << y << ")" << endl;

                mpos.x = x;

                mpos.y = y;

                bMouse = true;

                break;

        case EVENT_LBUTTONUP:

                cout << "EVENT_LBUTTONUP" << endl;

                break;

        case EVENT_RBUTTONDOWN:

                cout << "EVENT_RBUTTONDOWN" << endl;

                bMouse = true;

                break;

        }

}


void init_wiringpi()

{

        if(wiringPiSetup() == -1) exit(0);


        pinMode(1, PWM_OUTPUT);

        pwmSetMode(PWM_MODE_MS);

        pwmSetRange(1024);

        pwmSetClock(400);


        pinMode(23, PWM_OUTPUT);

        pwmSetMode(PWM_MODE_MS);

        pwmSetRange(1024);

        pwmSetClock(400);


        pwmWrite(1,     MIN_POS + (MAX_POS - MIN_POS) / 2);

        pwmWrite(23,    MIN_POS + (MAX_POS - MIN_POS) / 2);

}


void setPWM_1(int val)

{

        pwmWrite(23, val);

}


void setPWM_2(int val)

{

        pwmWrite(1, val);

}



void on_trackbar_1(int pos, void *ptr)

{

        int val = MIN_POS + pos * (MAX_POS - MIN_POS) / 100;

        setPWM_1(val);


        cout << "pos 1 [" << pos << ":" << val << "]" << endl;

}


void on_trackbar_2(int pos, void *ptr)

{

        int val = MIN_POS + pos * (MAX_POS - MIN_POS) / 100;

        setPWM_2(val);


        cout << "pos 2 [" << pos << ":" << val << "]" << endl;

}


void on_trackbar_3(int pos, void *ptr)

{

        int val = MIN_POS + pos * (MAX_POS - MIN_POS) / 100;

//      setPWM_1(val);

//      setPWM_2(val);


        setTrackbarPos("track 1", "cam 1", pos);

        setTrackbarPos("track 2", "cam 2", pos);


        cout << "pos 3 [" << pos << ":" << val << "]" << endl;

}


int main(int argc, char** argv)

{

        // opencv 2 style

        VideoCapture cap(0);

        int pos[2];


        init_wiringpi();


        if(!cap.isOpened())

        {

                cout << "No camera detected" << endl;

                return -1;

        }

        else

        {

                cout << "In capture ..." << endl;

                cap.set(CV_CAP_PROP_FRAME_WIDTH, 320);

                cap.set(CV_CAP_PROP_FRAME_HEIGHT, 240);

        }

/*

        VideoCapture cap2(1);

        if(!cap2.isOpened())

        {

                cout << "No camera detected" << endl;

                return -1;

        }

        else

        {

                cout << "In capture ..." << endl;

                cap2.set(CV_CAP_PROP_FRAME_WIDTH, 320);

                cap2.set(CV_CAP_PROP_FRAME_HEIGHT, 240);

        }

*/

        namedWindow("cam 1", WINDOW_AUTOSIZE );

//      namedWindow("cam 2", WINDOW_AUTOSIZE );

        namedWindow("control", WINDOW_AUTOSIZE );

        namedWindow("crop", WINDOW_AUTOSIZE );


        createTrackbar("track 1", "cam 1", &pos[0], 100, on_trackbar_1 );

//      createTrackbar("track 2", "cam 2", &pos[1], 100, on_trackbar_2 );

//      createTrackbar("track 3", "control", &pos[0], 100, on_trackbar_3 );


        setTrackbarPos("track 1", "cam 1", 50);

//      setTrackbarPos("track 2", "cam 2", 50);

//      setTrackbarPos("track 3", "control", 50);


        setMouseCallback("cam 1", CallBackFunc, NULL);


        Mat frame;

        Mat result;

        Mat tMat;

        Mat crop;


        double minVal;

        double maxVal;

        Point minLoc;

        Point maxLoc;

        Point matchLoc;


        for(;;)

        {


                Point pt[2];

                if(!cap.read(frame)) break;

                        pt[0].x = 150;

                        pt[0].y = 110;

                        pt[1].x = pt[0].x + 20;

                        pt[1].y = pt[0].y + 20;


                if(bMouse)

                {

                        tMat = frame.clone();

                        crop = Mat(tMat, Rect(mpos.x - 10, mpos.y - 10, 20, 20));

                        imshow("crop", crop);

                }


                matchTemplate( frame, crop, result, CV_TM_SQDIFF );

                normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() );

                minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );

                matchLoc = minLoc;

                cout << "matchLoc : " << matchLoc << endl;


                rectangle(frame, pt[0], pt[1], Scalar(0,0,0),2);

                rectangle(frame, Point(mpos.x - 10, mpos.y - 10), Point(mpos.x + 10, mpos.y + 10), Scalar(0,0,255),2);

                rectangle(frame, matchLoc, Point( matchLoc.x + 20 , matchLoc.y + 20 ), Scalar(0,255,0), 2);

#define SERVO_ANG       180

#define CAM_FOV         60

                if(bMouse)

                {

                        int tpos = getTrackbarPos("track 1", "cam 1");

//                      int value = tpos + (matchLoc.x - 160) * 3 * 2/ 100;

//                      int value = tpos + (100 / (SERVO_ANG / CAM_FOV)) * (matchLoc.x / 320) ;

                        int value = tpos + ((matchLoc.x - 160) * 60 / 3 /  320);

                        cout << "---- calc : " <<  value << endl;

                        setTrackbarPos("track 1", "cam 1", value);

                        bMouse = false;

                }


                imshow("cam 1", frame);

/*

                if(!cap2.read(frame)) break;

                rectangle(frame, pt[0], pt[1], Scalar(0,0,0),2);


                matchTemplate( frame, crop, result, CV_TM_SQDIFF );

                normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() );

                minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );

                matchLoc = minLoc;

                cout << "matchLoc : " << matchLoc << endl;


                rectangle(frame, matchLoc, Point( matchLoc.x + 20 , matchLoc.y + 20 ), Scalar(0,255,0), 2);

                        imshow("cam 2", frame);

*/

                if(waitKey(30) >= 0) break;

        }


        return 0;

} 



두쪽 버전

$ cat cv.cpp

#include <opencv2/core/core.hpp>

#include <opencv2/highgui/highgui.hpp>

#include <opencv2/imgproc/imgproc.hpp>

#include <iostream>


#include <wiringPi.h>


#define MIN_POS 30

#define MAX_POS 110


using namespace cv;

using namespace std;


bool bMouse = true;

Point mpos(160,120);


void CallBackFunc(int event, int x, int y, int flags, void* userdata)

{


        switch(event)

        {

        default:

                break;


        case EVENT_LBUTTONDOWN:

                cout << "EVENT_LBUTTONDOWN" << endl;

                cout << "pos (" << x << "," << y << ")" << endl;

                mpos.x = x;

                mpos.y = y;

                bMouse = true;

                break;

        case EVENT_LBUTTONUP:

                cout << "EVENT_LBUTTONUP" << endl;

                break;

        case EVENT_RBUTTONDOWN:

                cout << "EVENT_RBUTTONDOWN" << endl;

                bMouse = true;

                break;

        }

}


void init_wiringpi()

{

        if(wiringPiSetup() == -1) exit(0);


        pinMode(1, PWM_OUTPUT);

        pwmSetMode(PWM_MODE_MS);

        pwmSetRange(1024);

        pwmSetClock(400);


        pinMode(23, PWM_OUTPUT);

        pwmSetMode(PWM_MODE_MS);

        pwmSetRange(1024);

        pwmSetClock(400);


        pwmWrite(1,     MIN_POS + (MAX_POS - MIN_POS) / 2);

        pwmWrite(23,    MIN_POS + (MAX_POS - MIN_POS) / 2);

}


void setPWM_1(int val)

{

        pwmWrite(23, val);

}


void setPWM_2(int val)

{

        pwmWrite(1, val);

}



void on_trackbar_1(int pos, void *ptr)

{

        int val = MIN_POS + pos * (MAX_POS - MIN_POS) / 100;

        setPWM_1(val);


        cout << "pos 1 [" << pos << ":" << val << "]" << endl;

}


void on_trackbar_2(int pos, void *ptr)

{

        int val = MIN_POS + pos * (MAX_POS - MIN_POS) / 100;

        setPWM_2(val);


        cout << "pos 2 [" << pos << ":" << val << "]" << endl;

}


void on_trackbar_3(int pos, void *ptr)

{

        int val = MIN_POS + pos * (MAX_POS - MIN_POS) / 100;

        setPWM_1(val);

        setPWM_2(val);


        setTrackbarPos("track 1", "cam 1", pos);

        setTrackbarPos("track 2", "cam 2", pos);


        cout << "pos 3 [" << pos << ":" << val << "]" << endl;

}


int main(int argc, char** argv)

{

        // opencv 2 style

        VideoCapture cap(0);

        int pos[2];


        init_wiringpi();


        if(!cap.isOpened())

        {

                cout << "No camera detected" << endl;

                return -1;

        }

        else

        {

                cout << "In capture ..." << endl;

                cap.set(CV_CAP_PROP_FRAME_WIDTH, 320);

                cap.set(CV_CAP_PROP_FRAME_HEIGHT, 240);

        }


        VideoCapture cap2(1);

        if(!cap2.isOpened())

        {

                cout << "No camera detected" << endl;

                return -1;

        }

        else

        {

                cout << "In capture ..." << endl;

                cap2.set(CV_CAP_PROP_FRAME_WIDTH, 320);

                cap2.set(CV_CAP_PROP_FRAME_HEIGHT, 240);

        }


        namedWindow("cam 1", WINDOW_AUTOSIZE );

        namedWindow("cam 2", WINDOW_AUTOSIZE );

        namedWindow("control", WINDOW_AUTOSIZE );

        namedWindow("crop", WINDOW_AUTOSIZE );


        createTrackbar("track 1", "cam 1", &pos[0], 100, on_trackbar_1 );

        createTrackbar("track 2", "cam 2", &pos[1], 100, on_trackbar_2 );

        createTrackbar("track 3", "control", &pos[0], 100, on_trackbar_3 );


        setTrackbarPos("track 1", "cam 1", 50);

        setTrackbarPos("track 2", "cam 2", 50);

        setTrackbarPos("track 3", "control", 50);


        setMouseCallback("cam 1", CallBackFunc, NULL);


        Mat frame;

        Mat result;

        Mat tMat;

        Mat crop;


        double minVal;

        double maxVal;

        Point minLoc;

        Point maxLoc;

        Point matchLoc;


        for(;;)

        {


                Point pt[2];

                if(!cap.read(frame)) break;

                        pt[0].x = 150;

                        pt[0].y = 110;

                        pt[1].x = pt[0].x + 20;

                        pt[1].y = pt[0].y + 20;


                if(bMouse)

                {

                        tMat = frame.clone();

                        crop = Mat(tMat, Rect(mpos.x - 10, mpos.y - 10, 20, 20));

                        imshow("crop", crop);

                }


                matchTemplate( frame, crop, result, CV_TM_SQDIFF );

                normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() );

                minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );

                matchLoc = minLoc;

                cout << "matchLoc : " << matchLoc << endl;


                rectangle(frame, pt[0], pt[1], Scalar(0,0,0),2);

                rectangle(frame, Point(mpos.x - 10, mpos.y - 10), Point(mpos.x + 10, mpos.y + 10), Scalar(0,0,255),2);

                rectangle(frame, matchLoc, Point( matchLoc.x + 20 , matchLoc.y + 20 ), Scalar(0,255,0), 2);

#define SERVO_ANG       180

#define CAM_FOV         60

                if(bMouse)

                {

                        int tpos = getTrackbarPos("track 1", "cam 1");

                        int value = tpos + ((matchLoc.x - 160) * 60 / 3 /  320);

                        cout << "---- calc : " <<  value << endl;

                        setTrackbarPos("track 1", "cam 1", value);

                }


                imshow("cam 1", frame);


                if(!cap2.read(frame)) break;

                rectangle(frame, pt[0], pt[1], Scalar(0,0,0),2);


                matchTemplate( frame, crop, result, CV_TM_SQDIFF );

                normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() );

                minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );

                matchLoc = minLoc;

                cout << "matchLoc : " << matchLoc << endl;


                rectangle(frame, matchLoc, Point( matchLoc.x + 20 , matchLoc.y + 20 ), Scalar(0,255,0), 2);

                if(bMouse)

                {

                        int tpos = getTrackbarPos("track 2", "cam 2");

                        int value = tpos + ((matchLoc.x - 160) * 60 / 3 /  320);

                        cout << "---- calc : " <<  value << endl;

                        setTrackbarPos("track 2", "cam 2", value);

                        bMouse = false;

                }

                imshow("cam 2", frame);


                if(waitKey(30) >= 0) break;

        }


        return 0;

} 


'Programming > openCV' 카테고리의 다른 글

opencv 카메라 왜곡 수정  (0) 2015.10.20
opencv sift surf  (0) 2015.10.20
openCV + openMP 합치는게 잘 안되네?  (0) 2015.10.11
opencv 마우스 이벤트와 빠르게 그리기  (0) 2015.10.05
opencv 마우스 이벤트 관련 2  (0) 2015.10.05
Posted by 구차니