Проверьте, находится ли пиксель внутри капли для ofxOpenCV - PullRequest
0 голосов
/ 19 марта 2011

Я делаю применение концепции dodgeball, и мне нужно проверить, находится ли пиксель шара в захвате капель (который является изображением игрока).Я застрял и исчерпал идеи о том, как это реализовать.

Мне удалось немного продвинуться с каплями, но я не знаю, как это проверить?

Пожалуйста, помогите.

Я новичок в отчаянном состоянии.

Это часть моего кода.

void testApp::setup(){


    #ifdef _USE_LIVE_VIDEO
        vidGrabber.setVerbose(true);
        vidGrabber.initGrabber(widthS,heightS);
    #else
        vidPlayer.loadMovie("fingers.mov");
        vidPlayer.play();
    #endif
    widthS = 320;
    heightS = 240;
    colorImg.allocate(widthS,heightS);
    grayImage.allocate(widthS,heightS);
    grayBg.allocate(widthS,heightS);
    grayDiff.allocate(widthS,heightS); ////<---what I want

    bLearnBakground = true;
    threshold = 80;

    //////////circle//////////////
    counter = 0;
    radius = 0;
    circlePosX = 100;
    circlePosY=200;


}


void testApp::update(){

ofBackground(100,100,100);

    bool bNewFrame = false;

    #ifdef _USE_LIVE_VIDEO
       vidGrabber.grabFrame();
       bNewFrame = vidGrabber.isFrameNew();
    #else
        vidPlayer.idleMovie();
        bNewFrame = vidPlayer.isFrameNew();
    #endif

    if (bNewFrame){

        if (bLearnBakground == true){
            grayBg = grayImage;     // the = sign copys the pixels from grayImage into grayBg (operator overloading)
            bLearnBakground = false;
        }

        #ifdef _USE_LIVE_VIDEO
            colorImg.setFromPixels(vidGrabber.getPixels(),widthS,heightS);
        #else
            colorImg.setFromPixels(vidPlayer.getPixels(),widthS,heightS);
        #endif

        grayImage = colorImg;

        grayDiff.absDiff(grayBg, grayImage);
        grayDiff.threshold(threshold);

        contourFinder.findContours(grayDiff, 20, (340*240)/3, 10, true);    // find holes
    }



    ////////////circle////////////////////
    counter = counter + 0.05f;
    if(radius>=50){
        circlePosX = ofRandom(10,300);
        circlePosY = ofRandom(10,230);
    }
    radius = 5 + 3*(counter);

}


void testApp::draw(){

    // draw the incoming, the grayscale, the bg and the thresholded difference
    ofSetColor(0xffffff); //white colour
    grayDiff.draw(10,10);// draw start from point (0,0);
    // we could draw the whole contour finder

    // or, instead we can draw each blob individually,
    // this is how to get access to them:
    for (int i = 0; i < contourFinder.nBlobs; i++){
        contourFinder.blobs[i].draw(10,10);

    }

    ///////////////circle//////////////////////////
    //let's draw a circle:
    ofSetColor(0,0,255);
    char buffer[255];
    float a = radius;
    sprintf(buffer,"radius = %i",a);
    ofDrawBitmapString(buffer, 120, 300);

    if(radius>=50)
     {
        ofSetColor(255,255,255);
        counter = 0;
     }
     else{

        ofSetColor(255,0,0);

     }
     ofFill();
     ofCircle(circlePosX,circlePosY,radius);


}

Ответы [ 2 ]

2 голосов
/ 07 ноября 2011

Классический код на С ++ приведен ниже;(pno - номер блоба, x и y - точка для проверки)

bool testApp::pointInPolygon(int pno,int x, int y) {

int      i, j=blobTracker.blobs[pno].pts.size()-1 ;
bool  oddNodes= false;

for (i=0; i<blobTracker.blobs[pno].pts.size(); i++) {
    if (blobTracker.blobs[pno].pts[i].y<y && blobTracker.blobs[pno].pts[j].y>=y
        ||  blobTracker.blobs[pno].pts[j].y<y && blobTracker.blobs[pno].pts[i].y>=y) {
        if (blobTracker.blobs[pno].pts[i].x+(y-blobTracker.blobs[pno].pts[i].y)/(blobTracker.blobs[pno].pts[j].y-blobTracker.blobs[pno].pts[i].y)*(blobTracker.blobs[pno].pts[j].x-blobTracker.blobs[pno].pts[i].x)<x) {
            oddNodes=!oddNodes; }}
    j=i; }

return oddNodes; }
0 голосов
/ 11 июня 2011

Кодирование простого пользовательского интерфейса может помочь в тестировании таких алгоритмов.Нарисуйте шарик на экране, а затем переместите мышь вокруг, чтобы проверить ваш алгоритм: если ваш алгоритм говорит, что пиксель под указателем мыши должен быть внутри шарика, напечатайте сообщение о том, что это так, на экране, используя ofDrawBitmapString.

...