不规则四边形贴图(转)
用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
转载于:https://www.cnblogs.com/zhixing/archive/2012/03/28/2422506.html
不规则四边形贴图(转)相关推荐
- 两个不规则四边形IOU计算方法
1 引言 我们常用的目标检测为矩形框检测,但是我们有时检测出来的框为不规则的四边形,如下图为常见的遥感图像,此时我们在使用矩形框计算IOU的方式就不再适用.我们可以将问题进行抽象,有木有计算两个不规则 ...
- 点在不规则图形内算法python_目标检测算法中规则矩形和不规则四边形IOU的Python实现...
交并比(Intersection-over-Union,IoU),目标检测中使用的一个概念,我们在进行目标检测算法测试时,重要的指标,是产生的预测框(candidate bound)与标记框(grou ...
- python3实现cv2+numpy裁剪不规则四边形图片
python3实现cv2+numpy裁剪不规则四边形图片 功能 效果图![在这里插入图片描述](https://img-blog.csdnimg.cn/a3dd447909db43489050b3b8 ...
- 不规则四边形填充平面 - Townscaper 网格生成算法复现
不规则四边形填充平面 - Townscaper 网格生成算法复现 源码 github.com/FutaAlice/OrganicQuadGrid 前言 Townscaper,一款关于城镇建造的游戏. ...
- 计算几何@_@不规则四边形求法
一.托勒密定理(感觉有联系) 凸四边形 托勒密定理指出凸四边形两组对边乘积之和不小于两条对角线的乘积,等号当且仅当四边形为圆内接四边形,或退 化为直线取得(这时也称为欧拉定理).狭义的托勒密定理也可以 ...
- 计算不规则四边形的面积+代码实现
求两点间距离 /***** 求两点间距离*****/ float getDistance(CvPoint pointO, CvPoint pointA) {float distance;distanc ...
- 不规则四边形回归框计算IOU与NMS
前言 在复现DPR论文过程中,遇到了计算IOU和NMS的问题.传统目标检测大多基于anchor,给出的预测也是矩形框,所以需要进行相应的修改,以套用到不规则四边形回归框上. 注1:编者水平有限,如有谬 ...
- 【最简洁】一句CSS3代码实现不规则自定义背景图拼接样式,多用于异形弹窗背景图
如果阁下想玩进阶版的背景图样式请移步[进阶版九宫格背景图片]如何仅仅依靠background的几个属性组合搭配出酷炫的背景图片效果,并自适应任何宽高效果?_你挚爱的强哥❤给你发来1条消息❤-CSDN博 ...
- 不规则四边形的平行四边形化
这个我是应用到bmp文件中,然后在图像中任意画个四个点,最后平行四边形化,这个的重点 1.bmp的读取顺序,然后你的实际坐标和象素点上的坐标要对上的话,要反转. 2.四边形的平行四边化,这个比较简单, ...
最新文章
- 浅谈js本地图片预览
- 看哭了:程序员界有哪些经典的笑话?
- html分类代码查询,html标签元素分类(示例代码)
- 目前最强开源人脸检测算法RetinaFace
- varnish构建高速缓存
- (9)引入哈希桶的概念来实现一个哈希表
- 原生JavaScript事件详解
- 分享一款Web压力测试工具Pylot
- 电脑版微信防撤回插件
- dnf加点模拟器最新版85级版
- UVALive3713 Astronauts
- 聚观早报 | 苏宁易购入驻美团外卖;今日头条接入抖音电商
- HTML table表格 固定表头 tbody加滚动条
- Idea设置Java类注释模板和方法注释模板
- 为什么梦幻西游服务器名字有显示但是区名字没有了,梦幻西游:三月份的第一个新区注定要变鬼,从名字就能看得出来...
- .net core 不能更新数据
- 【深度学习前沿应用】图像分类Fine-Tuning
- 读现代操作系统第一二章笔记
- 东南大学计算机专业工程博士,东南大学计算机考博 - 考博 - 小木虫 - 学术 科研 互动社区...
- [思考][励志]《塔木德》