两个效果:放大和挤压,分别由MaxFrame和MinFrame函数实现, 可直接使用在摄像头中:
void MaxFrame(IplImage* frame) { uchar* old_data = (uchar*)frame->imageData; uchar* new_data = new uchar[frame->widthStep * frame->height]; int center_X = frame->width / 2; int center_Y = frame->height / 2; int radius = 400; int newX = 0; int newY = 0; int real_radius = (int)(radius / 2.0); for (int i = 0; i < frame->width; i++) { for (int j = 0; j < frame->height; j++) { int tX = i - center_X; int tY = j - center_Y; int distance = (int)(tX * tX + tY * tY); if (distance < radius * radius) { newX = (int)((float)(tX) / 2.0); newY = (int)((float)(tY) / 2.0); newX = (int) (newX * (sqrt((double)distance) / real_radius)); newX = (int) (newX * (sqrt((double)distance) / real_radius)); newX = newX + center_X; newY = newY + center_Y; new_data[frame->widthStep * j + i * 3] = old_data[frame->widthStep * newY + newX * 3]; new_data[frame->widthStep * j + i * 3 + 1] =old_data[frame->widthStep * newY + newX * 3 + 1]; new_data[frame->widthStep * j + i * 3 + 2] =old_data[frame->widthStep * newY + newX * 3 + 2]; } else { new_data[frame->widthStep * j + i * 3] = old_data[frame->widthStep * j + i * 3]; new_data[frame->widthStep * j + i * 3 + 1] = old_data[frame->widthStep * j + i * 3 + 1]; new_data[frame->widthStep * j + i * 3 + 2] = old_data[frame->widthStep * j + i * 3 + 2]; } } } memcpy(old_data, new_data, sizeof(uchar) * frame->widthStep * frame->height); delete new_data; }
void MinFrame(IplImage* frame) { uchar* old_data = (uchar*)frame->imageData; uchar* new_data = new uchar[frame->widthStep * frame->height]; int center_X = frame->width / 2; int center_Y = frame->height / 2; int radius = 0; double theta = 0; int newX = 0; int newY = 0; for (int i = 0; i < frame->width; i++) { for (int j = 0; j < frame->height; j++) { int tX = i - center_X; int tY = j - center_Y; theta = atan2((double)tY, (double)tX); radius = (int)sqrt((double)(tX * tX) + (double) (tY * tY)); int newR = (int)(sqrt((double)radius) * 12); newX = center_X + (int)(newR * cos(theta)); newY = center_Y + (int)(newR * sin(theta)); if (!(newX > 0 && newX < frame->width)) { newX = 0; } if (!(newY > 0 && newY < frame->height)) { newY = 0; } new_data[frame->widthStep * j + i * 3] = old_data[frame->widthStep * newY + newX * 3]; new_data[frame->widthStep * j + i * 3 + 1] =old_data[frame->widthStep * newY + newX * 3 + 1]; new_data[frame->widthStep * j + i * 3 + 2] =old_data[frame->widthStep * newY + newX * 3 + 2]; } } memcpy(old_data, new_data, sizeof(uchar) * frame->widthStep * frame->height); delete new_data; }

浙公网安备 33010602011771号