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 구차니
Programming/openCV2015. 10. 1. 11:53

엥? 2.1에서 단순하게 neon 활성화 하는데 이렇게 오른다고? ㄷㄷㄷ

OpenCv 2.1

– cvMatchTemplate() algorithm as the test case

cvMatchTemplate( img, tpl, res, CV_TM_CCORR_NORMED );



Flags:

CFLAGS += -pipe -O3

• Result: ~19.35sec @800Mhz


Flags:

CFLAGS += -pipe -O3 -mfpu=neon -ftree-vectorize -mfloat-abi=softfp

• Result: ~4.91sec @800Mhz

~75% increase in performance

[링크 : http://elinux.org/images/1/1c/Optimizing_the_Embedded_Platform_Using_OpenCV.pdf]


[링크 : http://answers.opencv.org/question/33940/are-these-functions-accelerated-by-arm-neon/]

    [링크 : http://answers.opencv.org/question/17845/open-source-neon-optimizations/]


NEON intrinsics 노가다..

[링크 : http://web.stanford.edu/class/cs231m/lectures/lecture-4-opencv.pdf]



+

g++ -lopencv_core -lopencv_video -lopencv_highgui -lopencv_imgproc -mfpu=neon -ftree-vectorize -mfloat-abi=hard MatchTemplate_Demo.cpp -o b.out

./b.out 1.jpg 2.jpg


음.. 차이가 없네...


openCV 3.0 부터 제한적으로 NEON을 옵션으로 제공하는 듯...

[링크 : http://answers.opencv.org/question/35233/neon-support-in-opencv/]

[링크 : http://opencv.org/opencv-3-0.html]

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

opencv 마우스 이벤트 관련 2  (0) 2015.10.05
opencv 템플릿 매칭 코드 관련  (0) 2015.10.03
openCV 템플릿 매칭 예제 실행  (0) 2015.10.01
opencv 버전들  (0) 2015.09.30
opencv 템플릿 매칭 관련  (0) 2015.09.28
Posted by 구차니
Programming/openCV2015. 10. 1. 09:58

1.jpg 816*612

2.jpg 190x44


x forwarding으로 해서 느린건지.. 일단은 미지수

암튼 실시간으로 추적은 힘들 수준이랄까..

해상도를 더 낮추지 않으면 1초에 1번 검색하기도 벅찰듯..


$ wget https://raw.githubusercontent.com/Itseez/opencv/master/samples/cpp/tutorial_code/Histograms_Matching/MatchTemplate_Demo.cpp

$ g++  -lopencv_imgproc -lopencv_core -lopencv_highgui MatchTemplate_Demo.cpp -o b.out

$ ./b.out 1.jpg 2.jpg


소스중에 이 부분을 주석처리 해주어야 함(사용 안하는 부분인가..)

#include "opencv2/imgcodecs.hpp"


결과물.. 아무튼 6가지 중에 2개 정도는 정상적으로 위치를 잡아 내지 못했다.

시간은 나중에 따로 프로그램 수정해서 측정을 해봐야 할 듯

SQDIFF / TM COEFF NORMED 두가지가 무난해 보이는데..

공식을 보면.. SQDIFF가 가장 CPU를 조금 쓸것으로 예상되긴 한다.




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


SQDIFF


SQDIFF NORMED


TM CCORR


TM CCORR NORMED


TM COEFF


TM COEFF NORMED


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

opencv 템플릿 매칭 코드 관련  (0) 2015.10.03
opencv neon 최적화  (0) 2015.10.01
opencv 버전들  (0) 2015.09.30
opencv 템플릿 매칭 관련  (0) 2015.09.28
openCV 에피폴라 기하 관련 내용  (0) 2015.09.28
Posted by 구차니