0

を使用してカメラ行列と歪み係数を見つけようとしていましたcvCalibrateCamera2。コンパイル エラーはありませんでしたが、プログラムを実行しようとすると、次のようになります。

OpenCV エラー: cvConvertPointsHomogenous、ファイル /build/buildd/opencv-2.3.1/modules/calib3d/src/fundam.cpp で、入力引数のサイズが一致しません (両方のマトリックスに同じ数のポイントが必要です)。

オブジェクト ポイントを 4 x 3 に格納するマトリックスのサイズと、イメージ ポイントを 4 X2 に格納するマトリックスのサイズ、何が間違っている可能性がありますか?

ここで、コードに特定の変更を加えました。これは私が使用しているコードです:

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/calib3d/calib3d.hpp"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//function to call cvCalibrateCamera2()
void calibrate(CvMat* object_points, CvMat* image_points, CvMat* intrinsic,CvMat* distortion)
{
const int point_count= object_points->rows;
const int image_count=object_points->rows/point_count;
CvMat* const full_object_points = cvCreateMat(image_count*point_count,3,CV_32FC1);
CvMat* const point_counts= cvCreateMat(image_count,1,CV_32SC1);
for(int i =0; i<image_count;i++)
{
CV_MAT_ELEM(*point_counts,float , i,0)= point_count;
    for(int j=0;j<point_count;j++)
    {
        for(int k=0; k<3;k++){
        CV_MAT_ELEM(*full_object_points,float,i*point_count+j,k)=CV_MAT_ELEM(*object_points,float,j,k);
        }
    }
}
cvCalibrateCamera2(full_object_points,image_points,point_counts,cvSize(1,1),intrinsic, distortion,NULL,NULL,0);
}
int main()
{
const float points[][2]={{1,2},{0,0},{3,5},{5,2}};
const int image_count=5;
const int point_count=sizeof(points)/sizeof(points[1]);
CvMat* const object_points=cvCreateMat(point_count,3,CV_32FC1);
for(int i=0; i<point_count;i++)
{
CV_MAT_ELEM(*object_points, float, i,0)=points[i][0];
CV_MAT_ELEM(*object_points, float, i,1)=points[i][1];
CV_MAT_ELEM(*object_points, float, i,2)=0;
}
CvMat* const image_points=cvCreateMat(image_count*point_count,2,CV_32FC1);
CvMat* const intrinsic=cvCreateMat(3,3,CV_32FC1);
CvMat* const distortion=cvCreateMat(5,1,CV_32FC1);
calibrate(object_points,image_points,intrinsic,distortion);
}

実行すると、次のエラーが発生します。

OpenCV エラー: cvReshape、ファイル /build/buildd/opencv-2.3.1/modules/core/src/array.cpp、行 2755 の不正な引数 (行列要素の総数が新しい行数で割り切れない) 「cv::Exception」のインスタンスをスローした後に呼び出された what(): /build/buildd/opencv-2.3.1/modules/core/src/array.cpp:2755: error: (-5) 行列の総数要素は、関数 cvReshape の新しい行数で割り切れません

中止 (コアダンプ)

4

1 に答える 1

0

まさにエラーメッセージの意味。画像ポイントと同じ量のポイントがオブジェクトに必要です。たとえば 10 セットのイメージ ポイントを使用して計算しようとしても、9 セットのオブジェクト ポイントを使用すると、このエラーが返されます。

ポイントと行列を入力としてベクトルを受け入れるため、c++ openCV を使用することをお勧めします。このようなベクトルの長さをチェックすることは、行列よりもはるかに簡単です。

于 2013-06-13T08:25:22.703 に答える