C# 如何使透视变换工作?
我只想复制发布的结果 我将源代码重写为EmguCV表单C# 如何使透视变换工作?,c#,image-processing,opencv,emgucv,perspective,C#,Image Processing,Opencv,Emgucv,Perspective,我只想复制发布的结果 我将源代码重写为EmguCV表单 Image<Bgr, byte> image = new Image<Bgr, byte>(@"B:\perspective.png"); CvInvoke.cvShowImage("Hello World!", image); float[,] scrp = { { 43, 18 }, { 280,40}, {19,223 }, { 304,200} }; float[,] ds
Image<Bgr, byte> image = new Image<Bgr, byte>(@"B:\perspective.png");
CvInvoke.cvShowImage("Hello World!", image);
float[,] scrp = { { 43, 18 }, { 280,40}, {19,223 }, { 304,200} };
float[,] dstp = { { 0,0}, { 320,0}, { 0,240 }, { 320,240 } };
float[,] homog = new float[3, 3];
Matrix<float> c1 = new Matrix<float>(scrp);
Matrix<float> c2 = new Matrix<float>(dstp);
Matrix<float> homogm = new Matrix<float>(homog);
CvInvoke.cvFindHomography(c1.Ptr, c2.Ptr, homogm.Ptr, Emgu.CV.CvEnum.HOMOGRAPHY_METHOD.DEFAULT, 0, IntPtr.Zero);
CvInvoke.cvGetPerspectiveTransform(c1, c2, homogm);
Image<Bgr, byte> newImage = image.WarpPerspective(homogm, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC, Emgu.CV.CvEnum.WARP.CV_WARP_DEFAULT, new Bgr(0, 0, 0));
CvInvoke.cvShowImage("newImage", newImage);
Image Image=新图像(@“B:\perspective.png”);
CvInvoke.cvShowImage(“你好,世界!”,图片);
float[,]scrp={{43,18},{280,40},{19223},{304200};
float[,]dstp={{0,0},{320,0},{0240},{320240};
float[,]homog=新的float[3,3];
矩阵c1=新矩阵(scrp);
矩阵c2=新矩阵(dstp);
矩阵homogm=新矩阵(homog);
CvInvoke.cvFindHomography(c1.Ptr,c2.Ptr,homogm.Ptr,Emgu.CV.CvEnum.HOMOGRAPHY_METHOD.DEFAULT,0,IntPtr.Zero);
CvInvoke.cvGetPerspectiveTransform(c1,c2,homogm);
Image newImage=Image.WarpPerspective(homogm,Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC,Emgu.CV.CvEnum.WARP.CV_WARP_默认值,新Bgr(0,0,0));
CvInvoke.cvShowImage(“newImage”,newImage);
这是测试图像。
新图像始终是空白图像
有人能帮我使源代码正常工作吗?希望我自己能找到答案 我把来源改写成了错误的形式。我应该使用点[],并且有
CameraCalibration.GetPerspectiveTransform
函数可供使用
PointF[] srcs = new PointF[4];
srcs[0] = new PointF(253, 211);
srcs[1] = new PointF(563, 211);
srcs[2] = new PointF(563, 519);
srcs[3] = new PointF(253, 519);
PointF[] dsts = new PointF[4];
dsts[0] = new PointF(234, 197);
dsts[1] = new PointF(520, 169);
dsts[2] = new PointF(715, 483);
dsts[3] = new PointF(81, 472);
HomographyMatrix mywarpmat = CameraCalibration.GetPerspectiveTransform(srcs, dsts);
Image<Bgr, byte> newImage = image.WarpPerspective(mywarpmat, Emgu.CV.CvEnum.INTER.CV_INTER_NN, Emgu.CV.CvEnum.WARP.CV_WARP_FILL_OUTLIERS, new Bgr(0, 0, 0));
PointF[]srcs=新的PointF[4];
srcs[0]=新的点f(253211);
srcs[1]=新的点f(563211);
srcs[2]=新的点f(563519);
srcs[3]=新的点f(253519);
PointF[]dsts=新的PointF[4];
dsts[0]=新的点f(234197);
dsts[1]=新的点f(520169);
dsts[2]=新的点F(715483);
dsts[3]=新的点f(81472);
同形矩阵mywarpmat=CameraCalibration.GetPerspectiveTransform(srcs,dsts);
Image newImage=Image.WarpPerspective(mywarpmat,Emgu.CV.CvEnum.INTER.CV_INTER_NN,Emgu.CV.CvEnum.WARP.CV_WARP_FILL_离群值,新Bgr(0,0,0));
以下是EmguCV版本3的扩展方法(该版本有许多不推荐使用的函数):
公共静态图像GetAxisAlignedImagePart(
这个图像输入,
四边形矩形,
四边形矩形,
大小目标图像大小)
其中TColor:struct,IColor
其中TDepth:new()
{
var src=new[]{rectSrc.P0,rectSrc.P1,rectSrc.P2,rectSrc.P3};
var dst=new[]{rectDst.P0,rectDst.P1,rectDst.P2,rectDst.P3};
使用(var-matrix=CvInvoke.GetPerspectiveTransform(src,dst))
{
使用(var cutimagepartion=new Mat())
{
CvInvoke.WarpPerspective(输入、CutimagePart、矩阵、targetImageSize、Inter.Cubic);
返回cutimagepartition.ToImage();
}
}
}
酷,tnx!你知道如果我有一个矩形物体的图像,如何得到边缘的比率吗?你说的“边缘比率”是什么意思?如果您指的是253、211等值,则必须在Paint程序或其他类似程序中手动测量图像。
public static Image<TColor, TDepth> GetAxisAlignedImagePart<TColor, TDepth>(
this Image<TColor, TDepth> input,
Quadrilateral rectSrc,
Quadrilateral rectDst,
Size targetImageSize)
where TColor : struct, IColor
where TDepth : new()
{
var src = new[] { rectSrc.P0, rectSrc.P1, rectSrc.P2, rectSrc.P3 };
var dst = new[] { rectDst.P0, rectDst.P1, rectDst.P2, rectDst.P3 };
using (var matrix = CvInvoke.GetPerspectiveTransform(src, dst))
{
using (var cutImagePortion = new Mat())
{
CvInvoke.WarpPerspective(input, cutImagePortion, matrix, targetImageSize, Inter.Cubic);
return cutImagePortion.ToImage<TColor, TDepth>();
}
}
}