我正在opencvv c ++上创建一个项目,在这里我必须在输出窗口的任意位置显示png图像。
下面的代码显示了多种颜色的球,我只需要图像而不是球,用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图像替换球,以使球笼漂浮在屏幕上。