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 구차니
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 구차니