void COpenCVMFCView::OnWarpAffine() { // TODO: Add your command handler code here CvPoint2D32f srcTri[3], dstTri[3]; CvMat* rot_mat = cvCreateMat(2,3,CV_32FC1); CvMat* warp_mat = cvCreateMat(2,3,CV_32FC1); IplImage *src=0, *dst=0; src = cvCloneImage(workImg); cvFlip(src); dst = cvCloneImage(src); dst->origin = src->origin; cvZero(dst); //COMPUTE WARP MATRIX srcTri[0].x = 0; //src Top left srcTri[0].y = 0; srcTri[1].x = (float) src->width - 1; //src Top right srcTri[1].y = 0; srcTri[2].x = 0; //src Bottom left srcTri[2].y = (float) src->height - 1; //- - - - - - - - - - - - - - -// dstTri[0].x = (float)(src->width*0.0); //dst Top left dstTri[0].y = (float)(src->height*0.33); dstTri[1].x = (float)(src->width*0.85); //dst Top right dstTri[1].y = (float)(src->height*0.25); dstTri[2].x = (float)(src->width*0.15); //dst Bottom left dstTri[2].y = (float)(src->height*0.7); cvGetAffineTransform(srcTri,dstTri,warp_mat); cvWarpAffine(src,dst,warp_mat); cvCopy(dst,src); //COMPUTE ROTATION MATRIX CvPoint2D32f center = cvPoint2D32f(src->width/2,src->height/2); double angle = -50.0; double scale = 0.6; cv2DRotationMatrix(center,angle,scale,rot_mat); cvWarpAffine(src,dst,rot_mat); //DO THE TRANSFORM: cvNamedWindow( "Affine_Transform", 1 ); cvShowImage( "Affine_Transform", dst ); m_ImageType = -3; cvWaitKey(); cvDestroyWindow( "Affine_Transform" ); cvReleaseImage(&src); cvReleaseImage(&dst); cvReleaseMat(&rot_mat); cvReleaseMat(&warp_mat); m_ImageType=imageType(workImg); }
double displayAffine(double x1,double x2,double x3,double x4,double x5,double x6) { // Set up variables int i, j; double res = 0; CvPoint2D32f srcTri[3], dstTri[3]; CvMat* rot_mat = cvCreateMat(2,3,CV_32FC1); CvMat* warp_mat = cvCreateMat(2,3,CV_32FC1); CvScalar scalar; IplImage *src, *dst; const char* name = "Mejor resultado de la pblación"; if(!(src=cvLoadImage("../images/ct_scan_trans.bmp",CV_LOAD_IMAGE_GRAYSCALE))) printf("Error loading image"); dst = cvCloneImage( src ); dst->origin = src->origin; cvZero( dst ); cvNamedWindow( name, 1 ); // Compute warp matrix srcTri[0].x = 0; srcTri[0].y = 0; srcTri[1].x = src->width - 1; srcTri[1].y = 0; srcTri[2].x = 0; srcTri[2].y = src->height - 1; dstTri[0].x = src->width*x1; dstTri[0].y = src->height*x2; dstTri[1].x = src->width*x3; dstTri[1].y = src->height*x4; dstTri[2].x = src->width*x5; dstTri[2].y = src->height*x6; CvScalar fillval=cvScalarAll(0); cvGetAffineTransform( srcTri, dstTri, warp_mat ); //cvWarpAffine( src, dst, warp_mat, CV_WARP_INVERSE_MAP+CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,fillval); cvWarpAffine( src, dst, warp_mat, CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,fillval); cvCopy ( dst, src ,NULL); cvShowImage( name, dst ); cvSaveImage("../images/output.bmp", dst,NULL); cvWaitKey(500); cvReleaseImage( &src ); cvReleaseImage( &dst ); cvReleaseMat( &rot_mat ); cvReleaseMat( &warp_mat ); return(res) ; }
/** * Body に画像をコラージュ */ void drawBodyPreLoad(xn::DepthGenerator& depth, xn::SkeletonCapability& capability, XnSkeletonJoint joint, XnUserID user, XnMapOutputMode mapMode, IplImage* preLoadImage, IplImage **rgbImage) { XnSkeletonJointPosition pos; IplImage *partImage = NULL; IplImage *fallImage = NULL; // ジョイント座標の取得 capability.GetSkeletonJointPosition(user, joint, pos); XnPoint3D pReal[1] = {pos.position}; XnPoint3D pProjective[1]; // 世界座標系から表示座標系に変換した座標を取得 depth.ConvertRealWorldToProjective(1, pReal, pProjective); // 重ね合わせよう画像 partImage = preLoadImage; fallImage = cvCreateImage(cvSize(mapMode.nXRes, mapMode.nYRes), IPL_DEPTH_8U, 3); CvPoint2D32f original[3]; CvPoint2D32f transform[3]; original[0] = cvPoint2D32f(0, 0); original[1] = cvPoint2D32f(mapMode.nXRes, 0); original[2] = cvPoint2D32f( 0, mapMode.nYRes); CvSize sizeOfPart = cvGetSize(partImage); int transX = pProjective[0].X - (sizeOfPart.width / 2); int transY = pProjective[0].Y - (sizeOfPart.height / 2); transform[0] = cvPoint2D32f( transX, transY); transform[1] = cvPoint2D32f( transX + mapMode.nXRes, transY); transform[2] = cvPoint2D32f( transX , transY + mapMode.nYRes); // 行列作成 CvMat *affineMatrix = cvCreateMat(2, 3, CV_32FC1); cvGetAffineTransform(original, transform, affineMatrix); // 移動 cvWarpAffine(partImage, fallImage, affineMatrix, CV_INTER_LINEAR | CV_WARP_FILL_OUTLIERS, cvScalarAll(0)); // 画像の重ね合わせ fallPartImage(fallImage, *rgbImage); // 解放 cvReleaseImage(&fallImage); //cvReleaseImage(&partImage); }
int main(int argc, char** argv) { CvPoint2D32f srcTri[3], dstTri[3]; CvMat* rot_mat = cvCreateMat(2,3,CV_32FC1); CvMat* warp_mat = cvCreateMat(2,3,CV_32FC1); IplImage *src, *dst; if( argc == 2 && ((src=cvLoadImage(argv[1],1)) != 0 )) { dst = cvCloneImage(src); dst->origin = src->origin; cvZero(dst); //COMPUTE WARP MATRIX srcTri[0].x = 0; //src Top left srcTri[0].y = 0; srcTri[1].x = src->width - 1; //src Top right srcTri[1].y = 0; srcTri[2].x = 0; //src Bottom left srcTri[2].y = src->height - 1; //- - - - - - - - - - - - - - -// dstTri[0].x = src->width*0.0; //dst Top left dstTri[0].y = src->height*0.33; dstTri[1].x = src->width*0.85; //dst Top right dstTri[1].y = src->height*0.25; dstTri[2].x = src->width*0.15; //dst Bottom left dstTri[2].y = src->height*0.7; cvGetAffineTransform(srcTri,dstTri,warp_mat); cvWarpAffine(src,dst,warp_mat); cvCopy(dst,src); //COMPUTE ROTATION MATRIX CvPoint2D32f center = cvPoint2D32f(src->width/2, src->height/2); double angle = -50.0; double scale = 0.6; cv2DRotationMatrix(center,angle,scale,rot_mat); cvWarpAffine(src,dst,rot_mat); //DO THE TRANSFORM: cvNamedWindow( "Affine_Transform", 1 ); cvShowImage( "Affine_Transform", dst ); cvWaitKey(); } cvReleaseImage(&dst); cvReleaseMat(&rot_mat); cvReleaseMat(&warp_mat); return 0; }
static GstFlowReturn gst_gcs_transform_ip(GstBaseTransform * btrans, GstBuffer * gstbuf) { GstGcs *gcs = GST_GCS (btrans); GST_GCS_LOCK (gcs); ////////////////////////////////////////////////////////////////////////////// // get image data from the input, which is RGBA or BGRA gcs->pImageRGBA->imageData = (char*)GST_BUFFER_DATA(gstbuf); cvSplit(gcs->pImageRGBA, gcs->pImgCh1, gcs->pImgCh2, gcs->pImgCh3, gcs->pImgChX ); cvCvtColor(gcs->pImageRGBA, gcs->pImgRGB, CV_BGRA2BGR); ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////MOTION CUES INTEGR//// ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// // apply step 1. filtering using bilateral filter. Cannot happen in-place => scratch cvSmooth(gcs->pImgRGB, gcs->pImgScratch, CV_BILATERAL, 3, 50, 3, 0); // create GRAY image cvCvtColor(gcs->pImgScratch, gcs->pImgGRAY, CV_BGR2GRAY); // Frame difference the GRAY and the previous one // not intuitive: first smooth frames, then cvCopy( gcs->pImgGRAY, gcs->pImgGRAY_copy, NULL); cvCopy( gcs->pImgGRAY_1, gcs->pImgGRAY_1copy, NULL); get_frame_difference( gcs->pImgGRAY_copy, gcs->pImgGRAY_1copy, gcs->pImgGRAY_diff); cvErode( gcs->pImgGRAY_diff, gcs->pImgGRAY_diff, NULL, 3); cvDilate( gcs->pImgGRAY_diff, gcs->pImgGRAY_diff, NULL, 3); ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// // ghost mapping gcs->dstTri[0].x = gcs->facepos.x - gcs->facepos.width/2 ; gcs->dstTri[0].y = gcs->facepos.y - gcs->facepos.height/2; gcs->dstTri[1].x = gcs->facepos.x - gcs->facepos.width/2; gcs->dstTri[1].y = gcs->facepos.y + gcs->facepos.height/2; gcs->dstTri[2].x = gcs->facepos.x + gcs->facepos.width/2; gcs->dstTri[2].y = gcs->facepos.y + gcs->facepos.height/2; if( gcs->ghostfilename){ cvGetAffineTransform( gcs->srcTri, gcs->dstTri, gcs->warp_mat ); cvWarpAffine( gcs->cvGhostBwResized, gcs->cvGhostBwAffined, gcs->warp_mat ); } ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// // GrabCut algorithm preparation and running gcs->facepos.x = gcs->facepos.x - gcs->facepos.width/2; gcs->facepos.y = gcs->facepos.y - gcs->facepos.height/2; // create an IplImage with the skin colour pixels as 255 compose_skin_matrix(gcs->pImgRGB, gcs->pImg_skin); // And the skin pixels with the movement mask cvAnd( gcs->pImg_skin, gcs->pImgGRAY_diff, gcs->pImgGRAY_diff); //cvErode( gcs->pImgGRAY_diff, gcs->pImgGRAY_diff, cvCreateStructuringElementEx(5, 5, 3, 3, CV_SHAPE_RECT,NULL), 1); cvDilate(gcs->pImgGRAY_diff, gcs->pImgGRAY_diff, cvCreateStructuringElementEx(7,7, 5,5, CV_SHAPE_RECT,NULL), 2); cvErode( gcs->pImgGRAY_diff, gcs->pImgGRAY_diff, cvCreateStructuringElementEx(5,5, 3,3, CV_SHAPE_RECT,NULL), 2); // if there is alpha==all 1's coming in, then we ignore it: prevents from no vibe before us if((0.75*(gcs->width * gcs->height) <= cvCountNonZero(gcs->pImgChX))) cvZero(gcs->pImgChX); // OR the input Alpha cvOr( gcs->pImgChX, gcs->pImgGRAY_diff, gcs->pImgGRAY_diff); ////////////////////////////////////////////////////////////////////////////// // try to consolidate a single mask from all the sub-patches cvDilate(gcs->pImgGRAY_diff, gcs->pImgGRAY_diff, cvCreateStructuringElementEx(7,7, 5,5, CV_SHAPE_RECT,NULL), 3); cvErode( gcs->pImgGRAY_diff, gcs->pImgGRAY_diff, cvCreateStructuringElementEx(5,5, 3,3, CV_SHAPE_RECT,NULL), 4); ////////////////////////////////////////////////////////////////////////////// // use either Ghost or boxes-model to create a PR foreground starting point in gcs->grabcut_mask if( gcs->ghostfilename) compose_grabcut_seedmatrix3(gcs->grabcut_mask, gcs->cvGhostBwAffined, gcs->pImgGRAY_diff ); else{ // toss it all to the bbox creation function, together with the face position and size compose_grabcut_seedmatrix2(gcs->grabcut_mask, gcs->facepos, gcs->pImgGRAY_diff, gcs->facefound ); } ////////////////////////////////////////////////////////////////////////////// #ifdef KMEANS gcs->num_clusters = 18; // keep it even to simplify integer arithmetics cvCopy(gcs->pImgRGB, gcs->pImgRGB_kmeans, NULL); posterize_image(gcs->pImgRGB_kmeans); create_kmeans_clusters(gcs->pImgRGB_kmeans, gcs->kmeans_points, gcs->kmeans_clusters, gcs->num_clusters, gcs->num_samples); adjust_bodybbox_w_clusters(gcs->grabcut_mask, gcs->pImgRGB_kmeans, gcs->num_clusters, gcs->facepos); #endif //KMEANS ////////////////////////////////////////////////////////////////////////////// if( gcs->debug < 70) run_graphcut_iteration( &(gcs->GC), gcs->pImgRGB, gcs->grabcut_mask, &gcs->bbox_prev); // get a copy of GRAY for the next iteration cvCopy(gcs->pImgGRAY, gcs->pImgGRAY_1, NULL); ////////////////////////////////////////////////////////////////////////////// // if we want to display, just overwrite the output if( gcs->display ){ int outputimage = gcs->debug; switch( outputimage ){ case 1: // output the GRAY difference cvCvtColor( gcs->pImgGRAY_diff, gcs->pImgRGB, CV_GRAY2BGR ); break; case 50:// Ghost remapped cvCvtColor( gcs->cvGhostBwAffined, gcs->pImgRGB, CV_GRAY2BGR ); break; case 51:// Ghost applied cvAnd( gcs->cvGhostBwAffined, gcs->pImgGRAY, gcs->pImgGRAY, NULL ); cvCvtColor( gcs->pImgGRAY, gcs->pImgRGB, CV_GRAY2BGR ); break; case 60:// Graphcut cvAndS(gcs->grabcut_mask, cvScalar(1), gcs->grabcut_mask, NULL); // get only FG cvConvertScale( gcs->grabcut_mask, gcs->grabcut_mask, 127.0); cvCvtColor( gcs->grabcut_mask, gcs->pImgRGB, CV_GRAY2BGR ); break; case 61:// Graphcut applied on input/output image cvAndS(gcs->grabcut_mask, cvScalar(1), gcs->grabcut_mask, NULL); // get only FG, PR_FG cvConvertScale( gcs->grabcut_mask, gcs->grabcut_mask, 255.0); cvAnd( gcs->grabcut_mask, gcs->pImgGRAY, gcs->pImgGRAY, NULL); cvCvtColor( gcs->pImgGRAY, gcs->pImgRGB, CV_GRAY2BGR ); cvRectangle(gcs->pImgRGB, cvPoint(gcs->bbox_now.x, gcs->bbox_now.y), cvPoint(gcs->bbox_now.x + gcs->bbox_now.width, gcs->bbox_now.y+gcs->bbox_now.height), cvScalar(127,0.0), 1, 8, 0 ); break; case 70:// bboxes cvZero( gcs->pImgGRAY ); cvMul( gcs->grabcut_mask, gcs->grabcut_mask, gcs->pImgGRAY, 40.0 ); cvCvtColor( gcs->pImgGRAY, gcs->pImgRGB, CV_GRAY2BGR ); break; case 71:// bboxes applied on the original image cvAndS(gcs->grabcut_mask, cvScalar(1), gcs->grabcut_mask, NULL); // get only FG, PR_FG cvMul( gcs->grabcut_mask, gcs->pImgGRAY, gcs->pImgGRAY, 1.0 ); cvCvtColor( gcs->pImgGRAY, gcs->pImgRGB, CV_GRAY2BGR ); break; case 72: // input alpha channel mapped to output cvCvtColor( gcs->pImgChX, gcs->pImgRGB, CV_GRAY2BGR ); break; #ifdef KMEANS case 80:// k-means output cvCopy(gcs->pImgRGB_kmeans, gcs->pImgRGB, NULL); break; case 81:// k-means output filtered with bbox/ghost mask cvSplit(gcs->pImgRGB_kmeans, gcs->pImgCh1, gcs->pImgCh2, gcs->pImgCh3, NULL ); cvAndS(gcs->grabcut_mask, cvScalar(1), gcs->grabcut_mask, NULL); // get FG and PR_FG cvConvertScale( gcs->grabcut_mask, gcs->grabcut_mask, 255.0); // scale any to 255. cvAnd( gcs->grabcut_mask, gcs->pImgCh1, gcs->pImgCh1, NULL ); cvAnd( gcs->grabcut_mask, gcs->pImgCh2, gcs->pImgCh2, NULL ); cvAnd( gcs->grabcut_mask, gcs->pImgCh3, gcs->pImgCh3, NULL ); cvMerge( gcs->pImgCh1, gcs->pImgCh2, gcs->pImgCh3, NULL, gcs->pImgRGB); break; #endif //KMEANS default: break; } } ////////////////////////////////////////////////////////////////////////////// // copy anyhow the fg/bg to the alpha channel in the output image alpha ch cvSplit(gcs->pImgRGB, gcs->pImgCh1, gcs->pImgCh2, gcs->pImgCh3, NULL ); cvAndS(gcs->grabcut_mask, cvScalar(1), gcs->grabcut_mask, NULL); // get only FG and possible FG cvConvertScale( gcs->grabcut_mask, gcs->grabcut_mask, 255.0); gcs->pImgChA->imageData = (char*)gcs->grabcut_mask->data.ptr; cvMerge( gcs->pImgCh1, gcs->pImgCh2, gcs->pImgCh3, gcs->pImgChA, gcs->pImageRGBA); gcs->numframes++; GST_GCS_UNLOCK (gcs); return GST_FLOW_OK; }
double affine(double x1,double x2,double x3,double x4,double x5,double x6) { // Set up variables int i, j; double res = 0; CvPoint2D32f srcTri[3], dstTri[3]; CvMat* rot_mat = cvCreateMat(2,3,CV_32FC1); CvMat* warp_mat = cvCreateMat(2,3,CV_32FC1); CvScalar scalar; IplImage *ori, *src, *dst, *obj; const char* name = "Affine_Transform"; if(!(src=cvLoadImage("../images/ct_scan_trans.bmp",CV_LOAD_IMAGE_GRAYSCALE))) printf("Error loading image"); dst = cvCloneImage( src ); dst->origin = src->origin; ori = cvCloneImage( src ); ori->origin = src->origin; cvZero( dst ); cvNamedWindow( name, 1 ); // Create angle and scale double angle = 0.0; double scale = 1.0; // Compute warp matrix srcTri[0].x = 0; srcTri[0].y = 0; srcTri[1].x = src->width - 1; srcTri[1].y = 0; srcTri[2].x = 0; srcTri[2].y = src->height - 1; dstTri[0].x = src->width*x1; dstTri[0].y = src->height*x2; dstTri[1].x = src->width*x3; dstTri[1].y = src->height*x4; dstTri[2].x = src->width*x5; dstTri[2].y = src->height*x6; CvScalar fillval=cvScalarAll(0); cvGetAffineTransform( srcTri, dstTri, warp_mat ); //cvWarpAffine( src, dst, warp_mat, CV_WARP_INVERSE_MAP+CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,fillval); cvWarpAffine( src, dst, warp_mat, CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,fillval); // Fitness if(!(obj=cvLoadImage("../images/ct_scan.bmp",CV_LOAD_IMAGE_GRAYSCALE))) printf("Error loading image"); uchar* data = (uchar *)obj->imageData; uchar* data2 = (uchar *)dst->imageData; int step = 10; for(i=0;i<(obj->height*obj->width)/10;i++){ //printf("%u - %u\n",data[i]-data2[i]); res =res + log(1+(abs(data[10*i]-data2[10*i]))); } //printf("%u", data[255]); //Show matrix /*int ustep = ori->widthStep/sizeof(uchar); for(i=0;i<ori->height;i++){ for(j=0;j<ori->width ;j++){ if(data[i*ustep+j] < 100) printf("0 "); else printf("1 "); //printf("%u", data[i*(ori->width)+j]); } printf("\n"); } */ //Show Images //cvShowImage( name, ori ); //cvWaitKey(0); //Show output matrix /* for(i=0;i<dst->height;i++){ for(j=0;j<dst->width ;j++){ if(data2[i*dst->widthStep/sizeof(uchar)+j] < 100) printf("0 "); else printf("1 "); //printf("%u", data[i*(ori->width)+j]); } printf("\n"); } */ /* int p[3]; p[0] = CV_IMWRITE_JPEG_QUALITY; p[1] = 100; p[2] = 0; */ //cvShowImage( name, ori ); //cvWaitKey(0); //cvShowImage( name, dst ); //cvWaitKey(500); //cvShowImage( name, dst ); //cvWaitKey(500); cvReleaseImage( &src ); cvReleaseImage( &dst ); cvReleaseImage( &ori ); cvReleaseImage( &obj ); cvReleaseMat( &rot_mat ); cvReleaseMat( &warp_mat ); //free(data); //free(data2); //printf("%f\n",res); return(res) ; }
//左上腕(LEFT_ELBOW - LEFT_SHOULDER)に画像をコラージュ void drawLeftArm(xn::DepthGenerator& depth, xn::SkeletonCapability& capability, XnUserID user, XnMapOutputMode mapMode, IplImage* preLoadImage, IplImage **rgbImage) { XnSkeletonJointPosition pos1,pos2; IplImage *partImage = NULL; IplImage *fallImage = NULL; // elbowのジョイント座標の取得 capability.GetSkeletonJointPosition(user, XN_SKEL_LEFT_ELBOW, pos1); XnPoint3D pReal1[1] = {pos1.position}; XnPoint3D pProjective1[1]; // 世界座標系から表示座標系に変換した座標を取得 depth.ConvertRealWorldToProjective(1, pReal1, pProjective1); // sholderのジョイント座標の取得 capability.GetSkeletonJointPosition(user, XN_SKEL_LEFT_SHOULDER, pos2); XnPoint3D pReal2[1] = {pos2.position}; XnPoint3D pProjective2[1]; // 世界座標系から表示座標系に変換した座標を取得 depth.ConvertRealWorldToProjective(1, pReal2, pProjective2); // 重ね合わせよう画像 partImage = preLoadImage; fallImage = cvCreateImage(cvSize(mapMode.nXRes, mapMode.nYRes), IPL_DEPTH_8U, 3); CvPoint2D32f original[3]; CvPoint2D32f transform[3]; original[0] = cvPoint2D32f(0, 0); original[1] = cvPoint2D32f(mapMode.nXRes, 0); original[2] = cvPoint2D32f( 0, mapMode.nYRes); CvSize sizeOfPart = cvGetSize(partImage); //ELBOWの位置 int transX1 = pProjective1[0].X; int transY1 = pProjective1[0].Y; //SHOULDERの位置 int transX2 = pProjective2[0].X; int transY2 = pProjective2[0].Y; //中間の座標 int transX3 = (transX1 + transX2) / 2; int transY3 = (transY1 + transY2) / 2; //画像の始点 int transX = transX3 - (sizeOfPart.width / 2); int transY = transY3 - (sizeOfPart.height / 2); //角度 float ang = cvFastArctan(transY2 - transY1, transX2 - transX1); //+ cvFastArctan(transY1, transX1); transform[0] = cvPoint2D32f( transX, transY); transform[1] = cvPoint2D32f( transX + mapMode.nXRes, transY); transform[2] = cvPoint2D32f( transX, transY + mapMode.nYRes); // 行列作成 CvMat *affineMatrix = cvCreateMat(2, 3, CV_32FC1); cvGetAffineTransform(original, transform, affineMatrix); // 移動 cvWarpAffine(partImage, fallImage, affineMatrix, CV_INTER_LINEAR | CV_WARP_FILL_OUTLIERS, cvScalarAll(0)); //回転行列作成 CvPoint2D32f center = cvPoint2D32f(transX3, transY3); IplImage *fallImage2 = cvCreateImage(cvSize(mapMode.nXRes, mapMode.nYRes), IPL_DEPTH_8U, 3); CvMat *rotationMatrix = cvCreateMat(2, 3, CV_32FC1); cv2DRotationMatrix(center, 90.0 - ang, 1.0, rotationMatrix); //回転 cvWarpAffine(fallImage, fallImage2, rotationMatrix, CV_INTER_LINEAR | CV_WARP_FILL_OUTLIERS, cvScalarAll(0)); // 画像の重ね合わせ fallPartImage(fallImage2, *rgbImage); // 解放 cvReleaseImage(&fallImage); cvReleaseImage(&fallImage2); }
int main(int argc, char* argv[]) { // Set up variables CvPoint2D32f srcTri[3], dstTri[3]; CvMat* rot_mat = cvCreateMat(2,3,CV_32FC1); CvMat* warp_mat = cvCreateMat(2,3,CV_32FC1); IplImage *src, *dst; const char* name = "Affine_Transform"; // Load image src=cvLoadImage("airplane.jpg"); dst = cvCloneImage( src ); dst->origin = src->origin; cvZero( dst ); cvNamedWindow( name, 1 ); // Create angle and scale double angle = 0.0; double scale = 1.0; // Create trackbars cvCreateTrackbar( "Angle", name, &angle_switch_value, 4, switch_callback_a ); cvCreateTrackbar( "Scale", name, &scale_switch_value, 4, switch_callback_s ); // Compute warp matrix srcTri[0].x = 0; srcTri[0].y = 0; srcTri[1].x = src->width - 1; srcTri[1].y = 0; srcTri[2].x = 0; srcTri[2].y = src->height - 1; dstTri[0].x = src->width*0.0; dstTri[0].y = src->height*0.25; dstTri[1].x = src->width*0.90; dstTri[1].y = src->height*0.15; dstTri[2].x = src->width*0.10; dstTri[2].y = src->height*0.75; cvGetAffineTransform( srcTri, dstTri, warp_mat ); cvWarpAffine( src, dst, warp_mat ); cvCopy ( dst, src ); while( 1 ) { switch( angleInt ){ case 0: angle = 0.0; break; case 1: angle = 20.0; break; case 2: angle = 40.0; break; case 3: angle = 60.0; break; case 4: angle = 90.0; break; } switch( scaleInt ){ case 0: scale = 1.0; break; case 1: scale = 0.8; break; case 2: scale = 0.6; break; case 3: scale = 0.4; break; case 4: scale = 0.2; break; } // Compute rotation matrix CvPoint2D32f center = cvPoint2D32f( src->width/2, src->height/2 ); cv2DRotationMatrix( center, angle, scale, rot_mat ); // Do the transformation cvWarpAffine( src, dst, rot_mat ); cvShowImage( name, dst ); if( cvWaitKey( 15 ) == 27 ) break; } cvReleaseImage( &dst ); cvReleaseMat( &rot_mat ); cvReleaseMat( &warp_mat ); return 0; }