embeded/raspberry pi2015. 10. 5. 22:05

cam 1은 왼쪽 눈깔.. (?)

cam 2는 오른쪽 눈깔

각각의 눈에 대한 pan (X축) 제어가 가능하며

control 윈도우는 두개 동시 동축 제어


우측 상단의 작은 창은 현재 클릭해서 저장된 영역이며

검은 사각형은 중심점

녹색 사각형은 클릭한 위치의 이미지와 매칭되는 영역

빨간 사각형은 클릭했던 위치이나... 별 의미는 없다

(클릭시 녹색 영역으로 겹치고 움직이면 이전 클릭 위치라는 정도니..)


초당 1프레임 겨우 하는 느낌이니..

쓰레드나  openMP 사용해서 프로세스 별로 분할해서 퍼포먼스를 올려봐야겠다.



$ cat makefile

all:

        g++ cv.cpp -lopencv_core -lopencv_video -lopencv_highgui -lopencv_imgproc -lwiringPi


clean:

        rm a.out


run:

        DISPLAY=:0.0 sudo ./a.out 


$ 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);

                        bMouse = false;

                }


                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);


                        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;

} 



Posted by 구차니
embeded/arduino(genuino)2015. 10. 5. 16:52

아두이노 보면 여러가지 버전(?)이라고 해야하나?

보드가 여러가지가 존재하는데


[링크 : https://www.arduino.cc/en/Reference/SPI]


세부적인걸 제외하면

Due만 AT91SAM ARM Cortex-m3 계열이고

나머지는 AVR 계열이다.

[링크 : http://arduinomidi.com/xe/BlogBoard/9489]

'embeded > arduino(genuino)' 카테고리의 다른 글

아두이노 나노 - 시리얼 테스트  (3) 2016.03.27
아두이노 나노 v3.0 / v3.1  (0) 2016.03.27
지름 도착 - 아두이노 나노/표준서보  (0) 2016.03.26
아두이노 부품들...  (0) 2015.06.29
아두이노 (arduino)  (0) 2011.12.29
Posted by 구차니
embeded/Cortex-M3 Ti2015. 10. 5. 16:47

SSIConfigSetExpClk() 에서

모드, 클럭, polarity, 데이터 버스 width를 설정한다.


static void SetSPIFunction(void)

{

SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);


GPIOPinConfigure(GPIO_PA2_SSI0CLK);

GPIOPinConfigure(GPIO_PA3_SSI0FSS);

GPIOPinConfigure(GPIO_PA4_SSI0RX);

GPIOPinConfigure(GPIO_PA5_SSI0TX);


GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 | GPIO_PIN_2);

SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 1000000, 8);

SSIEnable(SSI0_BASE);

}


ssi.h

#define SSI_FRF_MOTO_MODE_0     0x00000000  // Moto fmt, polarity 0, phase 0

#define SSI_FRF_MOTO_MODE_1     0x00000002  // Moto fmt, polarity 0, phase 1

#define SSI_FRF_MOTO_MODE_2     0x00000001  // Moto fmt, polarity 1, phase 0

#define SSI_FRF_MOTO_MODE_3     0x00000003  // Moto fmt, polarity 1, phase 1

#define SSI_FRF_TI              0x00000010  // TI frame format

#define SSI_FRF_NMW             0x00000020  // National MicroWire frame format


#define SSI_MODE_MASTER         0x00000000  // SSI master

#define SSI_MODE_SLAVE          0x00000001  // SSI slave

#define SSI_MODE_SLAVE_OD       0x00000002  // SSI slave with output disabled


[링크 : http://irmus.tistory.com/61]




아두이노의 Atmega 시리즈와 1:1 매칭되려나?


[링크 : https://www.arduino.cc/en/Reference/SPI]

'embeded > Cortex-M3 Ti' 카테고리의 다른 글

lm3s617 stepper rdk  (0) 2015.10.13
lm3s spi / ssi  (0) 2015.10.06
cortex-m3 ROM direct call  (0) 2015.09.25
LM3S Stellarisware - GPIOIntTypeSet  (0) 2015.08.03
bitband / cortex-m3  (0) 2013.08.16
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 구차니




[링크 : http://supcom.wikia.com/wiki/Supreme_Commander:_Forged_Alliance]


인구수는 건물+유닛 -_ㅠ

극단적으로 가면.. 생산효율을 위해서

T1 에너지 저장소 + T3 발전소 이런 뻘짓 보다는

그냥 발전소 더 짓는게 낫다는것 -_-a


[링크 : http://gaming.stackexchange.com/questions/185187/how-is-unit-limit-calculated]


확신은 없지만.. 공격 방향에 대해서 수평하게 짓는게 유리할 지도..

예를 들어 북에서 남쪽으로 공격할때 실드가 동에서 서로 무리를 지으면

겹쳐지는 부분에서 두개가 동시에 데미지 들어가는 느낌이었는데.. 아무튼 간격을 두고 단계별로 꺠지게

해야 좀더 효율이 오르려나?

[링크 : http://supcom.wikia.com/wiki/Shield_generator]

Posted by 구차니
개소리 왈왈/블로그2015. 10. 5. 08:50

결론은 싫으면 떠나던가 인가? -_-

암튼.. 블로그 슬슬 손을 놓고

독립 사이트로 단장해서 떠나던지 해야지..

언넝 위키에 박차를 가해야 겠다  -_-




'개소리 왈왈 > 블로그' 카테고리의 다른 글

다음 쪽지 종료 공지  (0) 2015.10.28
카카오 티스토리...  (0) 2015.10.07
방문자 급감 ㅠㅠ  (0) 2015.09.17
싸이월드 새단장?? 서비스 종료?  (0) 2015.09.14
기분전환겸 스킨 변경  (0) 2015.09.04
Posted by 구차니

....

한판에 2시간.. 거의 4번 넘게 져서 짜증이빠이 -_-


처음에 시작하자 마자 머 만들라고 하면 소소하게 계속 적이 쳐들어 오고

조금만 지나면 T2로 털러 오고..

극초반에는 적 일뿐으로 날 공격하지 않나 아오.. -_-



겨우겨우 다 넘기고 마지막 지도 확장 갔더니

사방이 적인데 방어 시스템 부재와 본진에서 병력 전부 이동시켜놔서 GG


아놔...

어찌어찌 끝!


적군 엔지니어 와서 그걸 강탈한 다음

나중에 시간을 들여 실험급 무기 왕창 생산 ㅋㅋㅋ























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