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 구차니
Programming/C Win32 MFC2015. 10. 12. 10:45

소스상으로는 "%d "와 "%d\n"으로

1바이트 차이일텐데... 이상하게 cpu 사용률이 다르게 나온다.

$ cat sp.c

#include <stdio.h>

#include <omp.h>


int main(int argc, char **argv)

{

        int a = 0;


        for(;;)

        {

        a++;

//      printf("%d ",a);

        printf("%d\n",a);

        }


        return 0;

}



물론. -fopenmp의 영향은 받지 않는다.

$ gcc -fopenmp -o b.out sp.c 


printf("%d ",a);

를 활성화


printf("%d\n",a);

를 활성화


fflush(stdout);

을 추가해서 해보니 비슷하게 나온다... printf()가 bufferd output인데

\n에서 강제로 fflush하게 하는건가..

[링크 : http://stackoverflow.com/.../why-does-stdout-need-explicit-flushing-when-redirected-to-file]

'Programming > C Win32 MFC' 카테고리의 다른 글

가변 매크로 __VA_ARGS__  (0) 2016.03.18
#import ?  (0) 2015.12.21
rand()와 RAND_MAX  (0) 2015.10.05
Cppcheck  (0) 2015.09.30
void형 포인터 ++  (0) 2015.07.14
Posted by 구차니
Programming/openMP2015. 10. 12. 09:23

흐음..

다음단계에서 확장되나... 소스레벨에서는 차이가 별로 안나네


-E



-S

먼가 우르르 나오는데 어셈이랑 안친해서 ㅠㅠ

아무튼 GOMP 어쩌구가 보이긴 하네..



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

openMP lock/unlock  (0) 2015.11.10
openmp 관련 정리글(win32)  (0) 2015.10.08
openmp 테스트 on rpi  (0) 2015.10.06
openCV + openMP  (0) 2015.09.30
openMP affinity 관련..  (0) 2015.07.23
Posted by 구차니
Programming/openCV2015. 10. 11. 16:23

흐음... 프레임도 낮도 하나에서 돌리는거 보다

단순하게 두개로 돌리는 것일 뿐(?) 같은데 왜이럴까..

pi@raspberrypi ~/src/cvmp $ DISPLAY=:0.0 ./cvmp.o

HIGHGUI ERROR: libv4l unable convert to requested pixfmt

세그멘테이션 오류


pi@raspberrypi ~/src/cvmp $ DISPLAY=:0.0 ./cvmp.o

HIGHGUI ERROR: libv4l unable convert to requested pixfmt

세그멘테이션 오류


pi@raspberrypi ~/src/cvmp $ DISPLAY=:0.0 ./cvmp.o

select timeout

select timeout

select timeout 


$ cat makefile
FLAGS = -fopenmp
LIBS = -lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_objdetect -lopencv_photo -lopencv_stitching -lopencv_ts -lopencv_video -lopencv_videostab

all:
        g++ $(FLAGS) $(LIBS) cvmp.cpp -o cvmp.o

run:

        DISPLAY=:0.0 ./cvmp.o 


$ cat cvmp.cpp
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <omp.h>

using namespace cv;
using namespace std;

int main(int argc, char **argv)
{
        omp_set_num_threads(2);
        char Cid[2] = {0,1};
        char *Wnd[2] = {"cam1","cam2"};

#pragma omp parallel
        {
                VideoCapture capture;
                Mat frame;

                int Thread = omp_get_thread_num();

                capture.open(Cid[Thread]);

                while (1)
                {
                        capture.read(frame);

                        namedWindow(Wnd[Thread], CV_WINDOW_NORMAL);
                        imshow(Wnd[Thread], frame);
                        waitKey(1);
                }

        }
}


[링크 : http://answers.opencv.org/question/68695/openmp-imshow/]

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

opencv sift surf  (0) 2015.10.20
시야각 내 각도 계산  (0) 2015.10.14
opencv 마우스 이벤트와 빠르게 그리기  (0) 2015.10.05
opencv 마우스 이벤트 관련 2  (0) 2015.10.05
opencv 템플릿 매칭 코드 관련  (0) 2015.10.03
Posted by 구차니
Programming/openMP2015. 10. 8. 17:45

정리가 잘되서 이해가 잘되는데

손으로 해봐야지 머.. ㅠㅠ


Parallel Programming, OpenMP 그리고 Win32 - 1

Parallel Programming, OpenMP 그리고 Win32 - 2

Parallel Programming, OpenMP 그리고 Win32 - 3

Parallel Programming, OpenMP 그리고 Win32 - 4

Parallel Programming, OpenMP 그리고 Win32 - 5

Parallel Programming, OpenMP 그리고 Win32 - 6


[링크 : http://himskim.egloos.com/3261640]

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

openMP lock/unlock  (0) 2015.11.10
openMP g++ -E -S  (2) 2015.10.12
openmp 테스트 on rpi  (0) 2015.10.06
openCV + openMP  (0) 2015.09.30
openMP affinity 관련..  (0) 2015.07.23
Posted by 구차니
Programming/openMP2015. 10. 6. 13:05

라즈베리는 나름(!) 쿼드코어니까 openmp 테스트 하긴 적절ㅋ


$ cat mp.cpp

#include <iostream>


int main(int argc, char **argv)

{

        #pragma omp parallel

        for(;;)

        {

                int a = 0;

                a++;

        }

        return 0 ;

}


$ g++ -fopenmp mp.cpp

$ ./a.out


쓰레드도 lightweight process 랬으니... 3*로 뜨는게 당연한건가?

$ pstree

init─┬─avahi-daemon───avahi-daemon

     ├─console-kit-dae───64*[{console-kit-dae}]

     ├─cron

     ├─2*[dbus-daemon]

     ├─dbus-launch

     ├─dhcpcd

     ├─7*[getty]

     ├─gvfs-afc-volume───{gvfs-afc-volume}

     ├─gvfs-gdu-volume───{gvfs-gdu-volume}

     ├─gvfs-gphoto2-vo

     ├─gvfsd

     ├─gvfsd-trash───{gvfsd-trash}

     ├─2*[ifplugd]

     ├─lightdm─┬─Xorg

     │         ├─lightdm─┬─lxsession─┬─lxpanel───3*[{lxpanel}]

     │         │         │           ├─openbox

     │         │         │           ├─pcmanfm───{pcmanfm}

     │         │         │           ├─ssh-agent

     │         │         │           └─{lxsession}

     │         │         └─{lightdm}

     │         └─2*[{lightdm}]

     ├─lxpolkit───{lxpolkit}

     ├─menu-cached───{menu-cached}

     ├─ntpd

     ├─polkitd───2*[{polkitd}]

     ├─rsyslogd───3*[{rsyslogd}]

     ├─sshd─┬─sshd───sshd───bash───a.out───3*[{a.out}]

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

     ├─thd

     ├─udevd───2*[udevd]

     └─udisks-daemon─┬─udisks-daemon

                     └─{udisks-daemon}


4개 cpu 100%씩 총합 399.2%.. 흐음..

$ top

top - 13:00:53 up  4:21,  2 users,  load average: 0.54, 0.28, 0.16

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

%Cpu0  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

%Cpu1  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

%Cpu2  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

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

KiB Mem:    883168 total,   779332 used,   103836 free,    70232 buffers

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


  PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND

16224 pi        20   0 27992  900  784 R 399.2  0.1   0:36.16 a.out 



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

openMP g++ -E -S  (2) 2015.10.12
openmp 관련 정리글(win32)  (0) 2015.10.08
openCV + openMP  (0) 2015.09.30
openMP affinity 관련..  (0) 2015.07.23
openMP parallel for private  (4) 2013.12.12
Posted by 구차니
Programming/C Win32 MFC2015. 10. 5. 16:01

잉여짓 하다가 발견


라즈베리 파이에서는 int형의 최대값 같은데..

./stdlib.h:129:#define  RAND_MAX        2147483647


시스템이나 라이브러리에 따라 32767 까지만 되는 것도 있다고 한다.

This value is library-dependent, but is guaranteed to be at least 32767 on any standard library implementation.

[링크 : http://www.cplusplus.com/reference/cstdlib/RAND_MAX/]

'Programming > C Win32 MFC' 카테고리의 다른 글

#import ?  (0) 2015.12.21
"\n" 의 cpu 점유율?  (0) 2015.10.12
Cppcheck  (0) 2015.09.30
void형 포인터 ++  (0) 2015.07.14
가변인자를 다시 넘겨주기  (2) 2015.07.07
Posted by 구차니
Programming/openCV2015. 10. 5. 12:55

마우스 이벤트에서 마우스 위치를 저장하고

메인 루프에서 imshow와 rectangle을 이용해서

다시 그리게 하는데 영 느리길래.. 속도를 어떻게 하면 올릴수 있을까 고민중..


[링크 : http://answers.opencv.org/question/5163/how-to-use-callback-to-draw-a-rectangle-in-a-video/]


$ cat mousecb.cpp

#include <opencv2/core/core.hpp>

#include <opencv2/highgui/highgui.hpp>

#include <opencv2/imgproc/imgproc.hpp>

#include <iostream>


using namespace std;

using namespace cv;


Point mpos(0,0);


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

{

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

mpos.x = x;

mpos.y = y;


switch(event)

{

case EVENT_MOUSEMOVE:

cout << "EVENT_MOUSEMOVE" << endl;

break;

case EVENT_LBUTTONDOWN:

cout << "EVENT_LBUTTONDOWN" << endl;

break;

case EVENT_LBUTTONUP:

cout << "EVENT_LBUTTONUP" << endl;

break;


case EVENT_RBUTTONDOWN:

cout << "EVENT_RBUTTONDOWN" << endl;

break;

case EVENT_RBUTTONUP:

cout << "EVENT_RBUTTONUP" << endl;

break;


case EVENT_MBUTTONDOWN:

cout << "EVENT_MBUTTONDOWN" << endl;

break;

case EVENT_MBUTTONUP:

cout << "EVENT_MBUTTONUP" << endl;

break;


case EVENT_LBUTTONDBLCLK:

cout << "EVENT_LBUTTONDBLCLK" << endl;

break;

case EVENT_RBUTTONDBLCLK:

cout << "EVENT_RBUTTONDBLCLK" << endl;

break;

case EVENT_MBUTTONDBLCLK:

cout << "EVENT_MBUTTONDBLCLK" << endl;

break;

/*

case EVENT_MOUSEWHEEL:

cout << "EVENT_MOUSEWHEEL" << endl;

break;

case EVENT_MOUSEHWHEEL:

cout << "EVENT_MOUSEHWHEEL" << endl;

break;

*/

}

}


int main(int argc, char** argv)

{

// Read image from file

Mat img = imread("MyPic.JPG");


//if fail to read the image

if ( img.empty() )

{

cout << "Error loading the image" << endl;

return -1;

}


//Create a window

namedWindow("My Window", 1);


//set the callback function for any mouse event

setMouseCallback("My Window", CallBackFunc, NULL);


//show the image

imshow("My Window", img);

for(;;)

{

rectangle(img, Point(mpos.x - 10, mpos.y - 10),

Point(mpos.x + 10, mpos.y + 10),

Scalar(0,0,0),2,8,0);


imshow("My Window", img);

// Wait until user press some key

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

}


return 0;

} 


+

CV_EXPORTS_W int waitKey(int delay = 0);

delay를 msec 단위로 주는거라.. 이녀석을 줄이면 좀 나아지긴 한다.



thread로 구분해서 하는 예제

[링크 : http://answers.opencv.org/.../waitkey1-timing-issues-causing-frame-rate-slow-down-fix/]

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

시야각 내 각도 계산  (0) 2015.10.14
openCV + openMP 합치는게 잘 안되네?  (0) 2015.10.11
opencv 마우스 이벤트 관련 2  (0) 2015.10.05
opencv 템플릿 매칭 코드 관련  (0) 2015.10.03
opencv neon 최적화  (0) 2015.10.01
Posted by 구차니
Programming/openCV2015. 10. 5. 11:35

대충 이렇게 쓰면 되려나?

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

{

switch(event)

{

case EVENT_MOUSEMOVE:

//x,y

break;

case EVENT_LBUTTONDOWN:

case EVENT_LBUTTONUP:

case EVENT_RBUTTONDOWN:

case EVENT_RBUTTONUP:

case EVENT_MBUTTONDOWN:

case EVENT_MBUTTONUP:

case EVENT_LBUTTONDBLCLK:

case EVENT_RBUTTONDBLCLK:

case EVENT_MBUTTONDBLCLK:


// case EVENT_MOUSEWHEEL:

// case EVENT_MOUSEHWHEEL:

}

}


setMouseCallback("My Window", CallBackFunc_Mouse, NULL); 


2.4.1 에서는 마우스 휠 이벤트가 없다. 3.0.0 부터 지원하는 듯

error: ‘EVENT_MOUSEWHEEL’ was not declared in this scope

error: ‘EVENT_MOUSEHWHEEL’ was not declared in this scope


---



enum   cv::MouseEventFlags

  cv::EVENT_FLAG_LBUTTON = 1, 

  cv::EVENT_FLAG_RBUTTON = 2, 

  cv::EVENT_FLAG_MBUTTON = 4, 

  cv::EVENT_FLAG_CTRLKEY = 8, 

  cv::EVENT_FLAG_SHIFTKEY = 16, 

  cv::EVENT_FLAG_ALTKEY = 32 

}

 

enum   cv::MouseEventTypes

  cv::EVENT_MOUSEMOVE = 0, 

  cv::EVENT_LBUTTONDOWN = 1, 

  cv::EVENT_RBUTTONDOWN = 2, 

  cv::EVENT_MBUTTONDOWN = 3, 

  cv::EVENT_LBUTTONUP = 4, 

  cv::EVENT_RBUTTONUP = 5, 

  cv::EVENT_MBUTTONUP = 6, 

  cv::EVENT_LBUTTONDBLCLK = 7, 

  cv::EVENT_RBUTTONDBLCLK = 8, 

  cv::EVENT_MBUTTONDBLCLK = 9, 

  cv::EVENT_MOUSEWHEEL = 10, 

  cv::EVENT_MOUSEHWHEEL = 11 

}


[링크 : http://docs.opencv.org/master/d7/dfc/group__highgui.html#gsc.tab=0] 


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

{

     if  ( event == EVENT_LBUTTONDOWN )

     {

          cout << "Left button of the mouse is clicked - position (" << x << ", " << y << ")" << endl;

     }

     else if  ( event == EVENT_RBUTTONDOWN )

     {

          cout << "Right button of the mouse is clicked - position (" << x << ", " << y << ")" << endl;

     }

     else if  ( event == EVENT_MBUTTONDOWN )

     {

          cout << "Middle button of the mouse is clicked - position (" << x << ", " << y << ")" << endl;

     }

     else if ( event == EVENT_MOUSEMOVE )

     {

          cout << "Mouse move over the window - position (" << x << ", " << y << ")" << endl;


     }

}


setMouseCallback("My Window", CallBackFunc, NULL);


[링크 : http://opencv-srf.blogspot.kr/2011/11/mouse-events.html] 


void onMouse( int event, int x, int y, int, void* )

[링크 : https://github.com/Itseez/opencv/blob/master/samples/cpp/ffilldemo.cpp]

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

 

2015/09/25 - [Programming/openCV] - opencv2 마우스 이벤트 / 클릭 위치


Posted by 구차니
Programming/openCV2015. 10. 3. 22:13

아.. 이런 원리인가!

template matching 방법을 정해주고

나온 이미지를 normalize 해서 0과 1로 출력하게 하고

minMaxLoc으로 매칭되는 부분을 찾고(포인트 단위)

원본 템플릿 이미지의 폭을 이용해서 박스를 그려준다.


+

normalize 된걸 출력해봤는데 

SQDIFF / TM CCORR 은 출력되는게 없고(normalize 되지 않아서 그런 듯)

SQDIFF NORMED / TM CCORR NORMED / TM COEFF / TM COEFF NORMED 만 나온다

+


Mat img;

Mat templ;

Mat result;

int match_method; // 6가지 종류의 매칭 방법(0~5)

double minVal; double maxVal; Point minLoc; Point maxLoc;


img = imread( argv[1], 1 );

templ = imread( argv[2], 1 );

    matchTemplate( img, templ, result, match_method );

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

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


    if( match_method  == CV_TM_SQDIFF || match_method == CV_TM_SQDIFF_NORMED )

        { matchLoc = minLoc; }

    else

        { matchLoc = maxLoc; }


    rectangle( img_display, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 );

    rectangle( result, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 );


[링크 : http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html]


C++: void matchTemplate(InputArray image, InputArray templ, OutputArray result, int method)

[링크 : http://docs.opencv.org/modules/imgproc/doc/object_detection.html#matchtemplate] 


C++: void normalize(InputArray src, OutputArray dst, double alpha=1, double beta=0, int norm_type=NORM_L2, int dtype=-1, InputArray mask=noArray() )

C++: void normalize(const SparseMat& src, SparseMat& dst, double alpha, int normType)

[링크 : http://docs.opencv.org/modules/core/doc/operations_on_arrays.html#normalize] 


C++: void minMaxLoc(InputArray src, double* minVal, double* maxVal=0, Point* minLoc=0, Point* maxLoc=0, InputArray mask=noArray())

C++: void minMaxLoc(const SparseMat& a, double* minVal, double* maxVal, int* minIdx=0, int* maxIdx=0 )

[링크 : http://docs.opencv.org/modules/core/doc/operations_on_arrays.html#minmaxloc] 


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

opencv 마우스 이벤트와 빠르게 그리기  (0) 2015.10.05
opencv 마우스 이벤트 관련 2  (0) 2015.10.05
opencv neon 최적화  (0) 2015.10.01
openCV 템플릿 매칭 예제 실행  (0) 2015.10.01
opencv 버전들  (0) 2015.09.30
Posted by 구차니