不规则四边形贴图(转)

用OpenCv可以搞定 两个函数: 
cvGetPerspectiveTransform  
cvWarpPerspective 

不多说了 给你段代码: 

C/C++ code CvPoint2D32f srcpoints[4]; CvPoint2D32f dstpoints[4]; srcpoints[0].x=o0x; //原图像当中四个点的位置 srcpoints[0].y=o0y; srcpoints[1].x=o1x; srcpoints[1].y=o1y; srcpoints[2].x=o2x; srcpoints[2].y=o2y; srcpoints[3].x=o3x; srcpoints[3].y=o3y; dstpoints[0].x=xofst0; //变换后对应的四个位置 dstpoints[0].y=yofst0; dstpoints[1].x=xofst1; dstpoints[1].y=yofst1; dstpoints[3].x=xofst2; dstpoints[3].y=yofst2; dstpoints[2].x=xofst3; dstpoints[2].y=yofst3; cvGetPerspectiveTransform(srcpoints,dstpoints,&mat ); //取得透视变换矩阵 cvWarpPerspective(src,dst,&mat,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,cvScalarAll(0)); //进行透视变换

 

 

网站转载的

staticint ComputePixel(float x, float y, outfloat x1, outfloat y1)
{
double r, nn;

if (x ==0&& y ==0)
{
x1
= x;
y1
= y;
return1;
}

nn
= Math.Sqrt(x * x + y * y);
r
= (Math.Abs(x) > Math.Abs(y)) ? Math.Abs(nn / x) : Math.Abs(nn / y);

x1
= (float)(r * x);
y1
= (float)(r * y);

return1;
}

static Color GetPixelColorInterpolated(ref Bitmap image, float x, float y)
{
int xi = (int)(x);
if (x <0) xi--;
int yi = (int)(y);
if (y <0) yi--;

if (xi <-1|| xi >= image.Width || yi <-1|| yi >= image.Height)
{
return GetPixelColorWithOverflow(ref image, -999, -999);
}

//get four neighbouring pixels
if ((xi +1) < image.Width && xi >=0&& (yi +1) < image.Height && yi >=0)
{
ushort wt1 = (ushort)((x - xi) *256.0f), wt2 = (ushort)((y - yi) *256.0f);
ushort wd = (ushort)(wt1 * wt2 >>8);
ushort wb = (ushort)(wt1 - wd);
ushort wc = (ushort)(wt2 - wd);
ushort wa = (ushort)(256- wt1 - wc);
ushort wrr, wgg, wbb;

Color clr
= image.GetPixel(xi, yi);
wbb
= (ushort)(wa * clr.B); wgg = (ushort)(wa * clr.G); wrr = (ushort)(wa * clr.R);

clr
= image.GetPixel(xi +1, yi);
wbb
+= (ushort)(wb * clr.B); wgg += (ushort)(wb * clr.G); wrr += (ushort)(wb * clr.R);

clr
= image.GetPixel(xi, yi +1);
wbb
+= (ushort)(wc * clr.B); wgg += (ushort)(wc * clr.G); wrr += (ushort)(wc * clr.R);

clr
= image.GetPixel(xi +1, yi +1);
wbb
+= (ushort)(wd * clr.B); wgg += (ushort)(wd * clr.G); wrr += (ushort)(wd * clr.R);

return Color.FromArgb(255, wrr >>8, wgg >>8, wbb >>8);
}
else
{
float t1 = x - xi, t2 = y - yi;
float d = t1 * t2;
float b = t1 - d;
float c = t2 - d;
float a =1- t1 - c;

Color rgb11, rgb21, rgb12, rgb22;
rgb11
= GetPixelColorWithOverflow(ref image, xi, yi);
rgb21
= GetPixelColorWithOverflow(ref image, xi +1, yi);
rgb12
= GetPixelColorWithOverflow(ref image, xi, yi +1);
rgb22
= GetPixelColorWithOverflow(ref image, xi +1, yi +1);

//calculate linear interpolation
return Color.FromArgb(255,
(
byte)(a * rgb11.R + b * rgb21.R + c * rgb12.R + d * rgb22.R),
(
byte)(a * rgb11.G + b * rgb21.G + c * rgb12.G + d * rgb22.G),
(
byte)(a * rgb11.B + b * rgb21.B + c * rgb12.B + d * rgb22.B));
}
}

static Color GetPixelColorWithOverflow(ref Bitmap image, long x, long y)
{
if (!IsInside(ref image, x, y))
{
return Color.FromArgb(255, 255, 255, 255);
}

return image.GetPixel((int)x, (int)y);
}

staticbool IsInside(ref Bitmap image, long x, long y)
{
return (0<= y && y < image.Height &&0<= x && x < image.Width);
}

privatevoid transformEllipseToolStripMenuItem_Click(object sender, EventArgs e)
{
Bitmap image
=new Bitmap("D:\\PSD\\info1.jpg");

int x, y;
float x1, y1;
float fx, fy, xmid, ymid, ar;
Bitmap image2
=new Bitmap(image);

xmid
= (float)(image.Width /2.0);
ymid
= (float)(image.Height /2.0);
ar
= (float)(image.Height) / (float)(image.Width);
for (y =0; y < image.Height; y++)
{
for (x =0; x < image.Width; x++)
{
ComputePixel(ar
* (x - xmid), y - ymid, out fx, out fy);
x1
= xmid + fx / ar;
y1
= ymid + fy;

image2.SetPixel(x, y, GetPixelColorInterpolated(
ref image, x1, y1));
}
}

this.pictureBox1.Image = image2;
}



 

这个文章不错

 

http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/imgtrans/warp_affine/warp_affine.html#warp-affine

 

http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=8940&p=34421&hilit=%E9%80%8F+%E8%A7%86+%E5%8F%98+%E6%8D%A2#p34421

posted on 2012-03-28 23:55  zhixing  阅读(1471)  评论(0编辑  收藏  举报