在随机位置显示png图像

时间:2018-12-02 07:17:12

标签: c++ opencv3.0

我正在opencvv c ++上创建一个项目,在这里我必须在输出窗口的任意位置显示png图像。

Balls Image link

下面的代码显示了多种颜色的球,我只需要图像而不是球,用c ++和opencv代码创建的球:

while (cvWaitKey(20) == -1) { 
    for (j = 0; j < NUMBER_BALLS; j++) {
        circle(matFrame, Point(balls[j].x, balls[j].y), balls[j].radius, balls[j].color, -1, CV_AA);
        if (BALLS_COLLIDE) circle(matMotion, Point(balls[j].x, balls[j].y), 
            balls[j].radius-3, Scalar(255,255,255), 1, CV_AA);
        else circle(matMotionDisplay, Point(balls[j].x, balls[j].y), 
            balls[j].radius-3, Scalar(255,255,255), 1, CV_AA);
        if (BALLS_COLLIDE) rectangle(matMotion, Point(balls[j].x-balls[j].radius+3, balls[j].y-balls[j].radius+3), 
            Point(balls[j].x+balls[j].radius-3, balls[j].y+balls[j].radius-3), Scalar(255,255,255), 1, 4);
        else rectangle(matMotionDisplay, Point(balls[j].x-balls[j].radius+3, balls[j].y-balls[j].radius+3), 
            Point(balls[j].x+balls[j].radius-3, balls[j].y+balls[j].radius-3), Scalar(255,255,255), 1, 4);


        if (balls[j].x > balls[j].radius && balls[j].y > balls[j].radius && balls[j].x < 640-balls[j].radius && 
                balls[j].y < 480-balls[j].radius && clock() - balls[j].ticksLast > CLOCKS_PER_SEC * SECONDS_BETWEEN_CONTACTS) {
            for (i = 0; i < 4; i++) {                                
                contactCounters[i]=0; 
                contactAccumulators[i]=0; 
            }
            for (i = 0; i < balls[j].radius*2; i++) {                    
                if (matMotion.at<uchar>(balls[j].y-balls[j].radius, balls[j].x-balls[j].radius+i) == 255) {
                    contactAccumulators[0] += balls[j].x-balls[j].radius+i;  
                    contactCounters[0]++;                            
                }
            }
            for (i = 0; i < balls[j].radius*2; i++) {                    
                if (matMotion.at<uchar>(balls[j].y-balls[j].radius+i, balls[j].x+balls[j].radius) == 255) {
                    contactAccumulators[1] += balls[j].y-balls[j].radius+i;  
                    contactCounters[1]++;                            
                }
            }   
            for (i = 1; i < balls[j].radius*2-2; i++) {                  
                if (matMotion.at<uchar>(balls[j].y+balls[j].radius, balls[j].x-balls[j].radius+i) == 255) {
                    contactAccumulators[2] += balls[j].x-balls[j].radius+i;  
                    contactCounters[2]++;                            
                }
            }
            for (i = 0; i < balls[j].radius*2; i++) {                    
                if (matMotion.at<uchar>(balls[j].y-balls[j].radius+i, balls[j].x-balls[j].radius) == 255) {
                    contactAccumulators[3] += balls[j].y-balls[j].radius+i;  
                    contactCounters[3]++;                            
                }
            }
            contactCountersMax = 0;
            for (i = 1; i < 4; i++)                                  
                if (contactCounters[i] > contactCounters[contactCountersMax]) contactCountersMax = i;

            if (contactCounters[contactCountersMax] > 0) {
                switch(contactCountersMax) {                         
                case 0:
                    pocX = contactAccumulators[0]/contactCounters[0]; pocY = balls[j].y-balls[j].radius;
                    break;
                case 1:
                    pocY = contactAccumulators[1]/contactCounters[1]; pocX = balls[j].x+balls[j].radius;
                    break;
                case 2:
                    pocX = contactAccumulators[2]/contactCounters[2]; pocY = balls[j].y+balls[j].radius;
                    break;
                case 3:
                    pocY = contactAccumulators[3]/contactCounters[3]; pocX = balls[j].x-balls[j].radius;
                    break;
                }
                balls[j].dX = (int)((balls[j].x - pocX) * DELTA_COEFFICIENT);
                balls[j].dY = (int)((balls[j].y - pocY) * DELTA_COEFFICIENT);            
                balls[j].ticksLast = clock();                                    

            }  
        }  

                if (balls[j].x < balls[j].radius) balls[j].dX = abs(balls[j].dX);
                else if (balls[j].x > 640 - balls[j].radius) balls[j].dX = -1 * abs(balls[j].dX);
                else if (balls[j].y < balls[j].radius) balls[j].dY = abs(balls[j].dY);
                else if (balls[j].y > 480 - balls[j].radius) balls[j].dY = -1 * abs(balls[j].dY);

        if (balls[j].dX > MAX_DELTA) balls[j].dX = MAX_DELTA;  
        if (balls[j].dX < -1*MAX_DELTA) balls[j].dX = -1*MAX_DELTA;
        if (balls[j].dY > MAX_DELTA) balls[j].dY = MAX_DELTA;  
        if (balls[j].dY < -1*MAX_DELTA) balls[j].dY = -1*MAX_DELTA;  
        balls[j].x += balls[j].dX; balls[j].y += balls[j].dY; 
    }  
    imshow(WIN_CAMERA, matFrame);
     //if (BALLS_COLLIDE) imshow(WIN_MOTION, matMotion);
    // else imshow(WIN_MOTION, matMotionDisplay);
}

我想用PNG图像替换球,以使球笼漂浮在屏幕上。

0 个答案:

没有答案