C# 如何通过调用Cv2.SolvePnP()修复未处理的OpenCVException?

C# 如何通过调用Cv2.SolvePnP()修复未处理的OpenCVException?,c#,opencv,exception,opencvsharp,C#,Opencv,Exception,Opencvsharp,我试着这样称呼你: 什么是src?什么是dst? 错误的详细信息(包括stacktrace)如下所示: HResult=-2146232832 Message=src.size == dst.size && src.channels() == dst.channels() Source=OpenCvSharp ErrMsg=src.size == dst.size && src.channels() == dst.channels() FileName=..\..

我试着这样称呼你:

什么是
src
?什么是dst?

错误的详细信息(包括stacktrace)如下所示:

HResult=-2146232832
Message=src.size == dst.size && src.channels() == dst.channels()
Source=OpenCvSharp
ErrMsg=src.size == dst.size && src.channels() == dst.channels()
FileName=..\..\..\modules\core\src\convert.cpp
FuncName=cvConvertScale
Line=5475
StackTrace:
     at OpenCvSharp.NativeMethods.<>c.<.cctor>b__1332_0(ErrorCode status, String funcName, String errMsg, String fileName, Int32 line, IntPtr userdata)
     at OpenCvSharp.NativeMethods.calib3d_solvePnP_vector(Point3f[] objectPoints, Int32 objectPointsLength, Point2f[] imagePoints, Int32 imagePointsLength, Double[,] cameraMatrix, Double[] distCoeffs, Int32 distCoeffsLength, Double[] rvec, Double[] tvec, Int32 useExtrinsicGuess, Int32 flags)
     at OpenCvSharp.Cv2.SolvePnP(IEnumerable`1 objectPoints, IEnumerable`1 imagePoints, Double[,] cameraMatrix, IEnumerable`1 distCoeffs, Double[]& rvec, Double[]& tvec, Boolean useExtrinsicGuess, SolvePnPFlags flags)
     at Test.SolvePnPTest.Main(String[] args) in <file path>.
InnerException: 

嗯,我认为

src.size == dst.size && src.channels() == dst.channels() in cvConvertScale()
您使用的函数中,源矩阵(src)与目标矩阵(dest)不同[在mat.size或/和mat.channels方面(其中一个具有不同的维度,未初始化,一个是RGB,另一个是灰度…),它们必须相同

这就是为什么

现在,我不是列表专家,我不确定这是否有意义,但在中,它们使用向量,请尝试一下:

 std::vector<Point3f> objectPoints;
 objectPoints.push_back(new Point3f(1, 2, 3));
 objectPoints.push_back(new Point3f(1, 2, 3));
 objectPoints.push_back(new Point3f(1, 2, 3));
 objectPoints.push_back(new Point3f(1, 2, 3));
std::向量对象点;
objectPoints.push_back(新的点3f(1,2,3));
objectPoints.push_back(新的点3f(1,2,3));
objectPoints.push_back(新的点3f(1,2,3));
objectPoints.push_back(新的点3f(1,2,3));

由于此方法重载失败

public static void SolvePnP(
    IEnumerable<Point3f> objectPoints,
    IEnumerable<Point2f> imagePoints,
    double[,] cameraMatrix,
    IEnumerable<double> distCoeffs,
    out double[] rvec,
    out double[] tvec,
    bool useExtrinsicGuess = false,
    SolvePnPFlags flags = SolvePnPFlags.Iterative
)
执行。完整示例代码:

using System.Collections.Generic;

using OpenCvSharp;

namespace Test
{
    public class SolvePnPTest
    {
        public static void Main(string[] args)
        {
            var objectPoints = new List<Point3f>();
            objectPoints.Add(new Point3f(1, 2, 3));
            objectPoints.Add(new Point3f(1, 2, 3));
            objectPoints.Add(new Point3f(1, 2, 3));
            objectPoints.Add(new Point3f(1, 2, 3));

            var imagePoints = new List<Point2f>();
            imagePoints.Add(new Point2f(1, 2));
            imagePoints.Add(new Point2f(1, 2));
            imagePoints.Add(new Point2f(1, 2));
            imagePoints.Add(new Point2f(1, 2));

            var rvec = new double[3];
            var tvec = new double[3];

            var cameraMatrix = new double[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
            var distortionCoefficients = new double[] { 1, 2, 3, 4, 5 };

            /*
            Cv2.SolvePnP(
                objectPoints,
                imagePoints,
                cameraMatrix,
                distortionCoefficients,
                out rvec,
                out tvec);
             * 
             * */

            Cv2.SolvePnP(
                new Mat(objectPoints.Count, 3, MatType.CV_64F, objectPoints.ToArray()),
                new Mat(imagePoints.Count, 2, MatType.CV_64F, imagePoints.ToArray()),
                new Mat(3, 3, MatType.CV_64F, cameraMatrix),
                new Mat(5, 1, MatType.CV_64F, distortionCoefficients),
                new Mat(3, 1, MatType.CV_64F),
                new Mat(3, 1, MatType.CV_64F));
        }
    }
}
使用System.Collections.Generic;
使用OpenCvSharp;
名称空间测试
{
公共类偿付能力测试
{
公共静态void Main(字符串[]args)
{
var objectPoints=新列表();
添加(新的点3f(1,2,3));
添加(新的点3f(1,2,3));
添加(新的点3f(1,2,3));
添加(新的点3f(1,2,3));
var imagePoints=新列表();
添加(新的点2f(1,2));
添加(新的点2f(1,2));
添加(新的点2f(1,2));
添加(新的点2f(1,2));
var rvec=新的双精度[3];
var tvec=新的双精度[3];
var cameraMatrix=新的双[,]{{1,2,3},{4,5,6},{7,8,9};
var畸变系数=新的双[]{1,2,3,4,5};
/*
Cv2.PNP(
反对意见,
imagePoints,
cameraMatrix,
扭曲效率,
在rvec之外,
(tvec),;
* 
* */
Cv2.PNP(
新Mat(objectPoints.Count,3,MatType.CV_64F,objectPoints.ToArray()),
新Mat(imagePoints.Count,2,MatType.CV_64F,imagePoints.ToArray()),
新垫(3,3,MatType.CV_64F,cameraMatrix),
新垫(5,1,MatType.CV_64F,变形系数),
新垫(3,1,垫型CV_64F),
新垫(3,1,垫型CV_64F));
}
}
}

src
=源代码和
dst
=destination@usmanlqbal那没用,我不是在问缩写词的意思。哦!对。尽管如此,这里还是发生了一些奇怪的事情,因为它们显然具有相同的大小和频道!:\
 std::vector<Point3f> objectPoints;
 objectPoints.push_back(new Point3f(1, 2, 3));
 objectPoints.push_back(new Point3f(1, 2, 3));
 objectPoints.push_back(new Point3f(1, 2, 3));
 objectPoints.push_back(new Point3f(1, 2, 3));
public static void SolvePnP(
    IEnumerable<Point3f> objectPoints,
    IEnumerable<Point2f> imagePoints,
    double[,] cameraMatrix,
    IEnumerable<double> distCoeffs,
    out double[] rvec,
    out double[] tvec,
    bool useExtrinsicGuess = false,
    SolvePnPFlags flags = SolvePnPFlags.Iterative
)
public static void SolvePnP(
    InputArray objectPoints,
    InputArray imagePoints,
    InputArray cameraMatrix,
    InputArray distCoeffs,
    OutputArray rvec,
    OutputArray tvec,
    bool useExtrinsicGuess = false,
    SolvePnPFlags flags = SolvePnPFlags.Iterative
)
using System.Collections.Generic;

using OpenCvSharp;

namespace Test
{
    public class SolvePnPTest
    {
        public static void Main(string[] args)
        {
            var objectPoints = new List<Point3f>();
            objectPoints.Add(new Point3f(1, 2, 3));
            objectPoints.Add(new Point3f(1, 2, 3));
            objectPoints.Add(new Point3f(1, 2, 3));
            objectPoints.Add(new Point3f(1, 2, 3));

            var imagePoints = new List<Point2f>();
            imagePoints.Add(new Point2f(1, 2));
            imagePoints.Add(new Point2f(1, 2));
            imagePoints.Add(new Point2f(1, 2));
            imagePoints.Add(new Point2f(1, 2));

            var rvec = new double[3];
            var tvec = new double[3];

            var cameraMatrix = new double[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
            var distortionCoefficients = new double[] { 1, 2, 3, 4, 5 };

            /*
            Cv2.SolvePnP(
                objectPoints,
                imagePoints,
                cameraMatrix,
                distortionCoefficients,
                out rvec,
                out tvec);
             * 
             * */

            Cv2.SolvePnP(
                new Mat(objectPoints.Count, 3, MatType.CV_64F, objectPoints.ToArray()),
                new Mat(imagePoints.Count, 2, MatType.CV_64F, imagePoints.ToArray()),
                new Mat(3, 3, MatType.CV_64F, cameraMatrix),
                new Mat(5, 1, MatType.CV_64F, distortionCoefficients),
                new Mat(3, 1, MatType.CV_64F),
                new Mat(3, 1, MatType.CV_64F));
        }
    }
}