2

私は次のよう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);
}
4

2 に答える 2

1

まあ、私が思う唯一の理由は

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

ソースマトリックス(src)が宛先マトリックス(dest)と同じではない関数を使用しているということです[mat.sizeまたは/およびmat.channelsに関して(それらの1つは異なる次元を持っています、未初期化、一方が RGB で、もう一方がグレースケールの場合 ...)] 同じである必要があります。

それが「なんで?」そのために。

さて、私はリストの専門家ではないので、これが理にかなっているのかどうかはわかりませんが、SolvePnp のドキュメントでは、ベクトルを使用して試してみてください:

 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));
于 2016-05-18T11:01:47.527 に答える