c# - 如何修复调用 Cv2.SolvePnP() 时未处理的 OpenCVException?

标签 c# opencv exception

我尝试调用Cv2.SolvePnP()opencvsharp像这样:

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 的调用失败,并出现未处理的 OpenCVException:

src.size == dst.size && src.channels() == dst.channels()

什么是src?什么是dst

包括堆栈跟踪在内的错误详细信息如下所示:

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: 

我的代码有什么问题?

convert.cpp中的断言在这个opencv函数中:

CV_IMPL void
cvConvertScale( const void* srcarr, void* dstarr,
                double scale, double shift )
{
    cv::Mat src = cv::cvarrToMat(srcarr), dst = cv::cvarrToMat(dstarr);

    CV_Assert( src.size == dst.size && src.channels() == dst.channels() );
    src.convertTo(dst, dst.type(), scale, shift);
}

最佳答案

由于该方法的重载失败,

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
)

我试过the other

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));
        }
    }
}

关于c# - 如何修复调用 Cv2.SolvePnP() 时未处理的 OpenCVException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37279776/

相关文章:

c# - RIA 身份验证期间出现问题

c# - 使用 Azure 移动服务向非事件用户发送通知。在哪里保存 "lastLoginDate"并对其进行过滤?

python - PiCameraValueError : Incorrect buffer length for resolution 1920x1080

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

c# - Entity Framework 空间聚合函数

c# - 在 C# 中,方法是否可以返回 List 以便客户端只能读取它而不能写入它?

opencv - haarcascade_frontalface_default.xml在什么数据集上受训?

android - 在 Android 的 openCV 中使用 CLAHE

c# - .Net 紧凑型框架 SqlClient 异常

python - 如何检查类是否为异常类?