Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使透视变换工作?_C#_Image Processing_Opencv_Emgucv_Perspective - Fatal编程技术网

C# 如何使透视变换工作?

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

我只想复制发布的结果

我将源代码重写为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[,] 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>();
        }
    }
}