#include #include #include #include typedef struct { unsigned char r,g,b; }rgb; int main(int argc, char** argv) { int iy = 0, ix = 0, step = 0, phases; rgb *temp1 = 0, *temp2 = 0, *tempOut = 0; char *pStart1, *pStart2, *pOut, name[100]; IplImage *image1 = 0, *image2 = 0, *imageOut = 0; argv++; phases = atoi(*argv++); image1 = cvLoadImage(*argv++, CV_LOAD_IMAGE_COLOR); image2 = cvLoadImage(*argv++, CV_LOAD_IMAGE_COLOR); imageOut = cvCreateImage(cvGetSstepe( image1 ), 8, 3); for(step = 0; step < phases; step++) { for(ix = 0; ix < image1->height; ix++) { pStart1 = image1->imageData + ix * image1->widthStep; pStart2 = image2->imageData + ix * image2->widthStep; pOut = imageOut->imageData + ix * imageOut->widthStep; for(iy = 0; iy < image1->width; iy++) { temp1 = (rgb*)(pStart1 + (iy * 3)); temp2 = (rgb*)(pStart2 + (iy * 3)); tempOut = (rgb*)(pOut + (iy * 3)); tempOut->r = (temp1->r * step) / phases + (temp2->r * (phases - step)) / phases; tempOut->g = (temp1->g * step) / phases + (temp2->g * (phases - step)) / phases; tempOut->b = (temp1->b * step) / phases + (temp2->b * (phases - step)) / phases; } } sprintf(name, "transition%03d.png", step); cvSaveImage(name, imageOut); sprintf(name, "transition%03d.png", phases * 2 - step - 1); cvSaveImage(name, imageOut); } cvReleaseImage(&image1); cvReleaseImage(&image2); cvReleaseImage(&imageOut); return 0; }