2

現在、ステレオカメラを修正して視差マップを作成しようとしています。残念ながら、エラーが発生し続けるため、ステレオ修正手順を通過できません。

「OpenCVエラー:不明な関数の引数が正しくありません。ファイル.. \ .. \ .. \ modules \ core \ src \ matrix.cpp、697行目。」

私はカメラを調整した人ではなく、ビデオの録画に使用されたカメラにもアクセスできないため、プロセスは複雑です。すべてのキャリブレーションパラメーター(組み込み関数、歪み係数、回転行列、および並進ベクトル)が与えられました。ご覧のとおり、これらを直接CvMatsに変換して使用しようとしましたが、実際に使用しようとするとエラーが発生します。

前もって感謝します。

CvMat li, lm, ri, rm, r, t, Rl, Rr, Pl, Pr;    

double init_li[3][3] = 
    {   {477.984984743, 0, 316.17458671}, 
    {0, 476.861945645, 253.45073026}, 
    {0, 0 ,1}   };
double init_lm[5] = {-0.117798518453, 0.147554949385, -0.0549082041898, 0, 0};
double init_ri[3][3] = 
    {{478.640315323, 0, 299.957994781}, 
    {0, 477.898896505, 251.665771947}, 
    {0, 0, 1}};
double init_rm[5] = {-0.10884732532, 0.12118405303, -0.0322073237741, 0, 0};
double init_r[3][3] = 
    {{0.999973709051976, 0.00129700728791757, -0.00713435189275776},
    {-0.00132096594266573, 0.999993501087837, -0.00335452397041856}, 
    {0.00712995468519435, 0.00336386001267643, 0.99996892361313}};
double init_t[3] = {-0.0830973040641153, -0.00062704210860633, 1.4287643345188e-005};

cvInitMatHeader(&li, 3, 3, CV_64FC1, init_li);
cvInitMatHeader(&lm, 5, 1, CV_64FC1, init_lm);
cvInitMatHeader(&ri, 3, 3, CV_64FC1, init_ri);
cvInitMatHeader(&rm, 5, 1, CV_64FC1, init_rm);
cvInitMatHeader(&r, 3, 3, CV_64FC1, init_r);
cvInitMatHeader(&t, 3, 1, CV_64FC1, init_t);
cvInitMatHeader(&Rl, 3,3, CV_64FC1);
cvInitMatHeader(&Rr, 3,3, CV_64FC1);
cvInitMatHeader(&Pl, 3,4, CV_64FC1);
cvInitMatHeader(&Pr, 3,4, CV_64FC1);

//frame is a cv::MAT holding the first frame of the video.
CvSize imageSize = frame.size();
imageSize.width /= 2;

//IT BREAKS HERE
cvStereoRectify(&li, &ri, &lm, &rm, imageSize, &r, &t, &Rl, &Rr, &Pl, &Pr);
4

2 に答える 2

0

わかりました、それで私は答えを理解しました。問題は、Rl、Rr、Pl、およびPrのヘッダーを初期化しただけで、データ自体にメモリが割り当てられなかったことです。私はそれを次のように修正することができました:

double init_Rl[3][3];
double init_Rr[3][3];
double init_Pl[3][4];
double init_Pr[3][4];

cvInitMatHeader(&Rl, 3,3, CV_64FC1, init_Rl);
cvInitMatHeader(&Rr, 3,3, CV_64FC1, init_Rr);
cvInitMatHeader(&Pl, 3,4, CV_64FC1, init_Pl);
cvInitMatHeader(&Pr, 3,4, CV_64FC1, init_Pr);

ただし、cv::stereoRectifyをcv::Mattsをパラメーターとして使用できた可能性があるという理論があります。これにより、作業がはるかに簡単になります。cv :: stereoRectifyが存在するかどうかはわかりませんが、他の多くのc関数のバージョンがcv名前空間にあるようです。わかりにくい場合は、OpenCVを初めて使用します。

于 2013-03-19T17:53:24.367 に答える
0

だから、あなたはc-apiに噛まれましたか?背を向けてみませんか?

可能な限りc++apiを使用してください。古い(1.0)、非推奨のapiでopencvの学習を開始しないでください。

double init_li[9] = 
    {   477.984984743, 0, 316.17458671, 
    0, 476.861945645, 253.45073026, 
    0, 0 ,1  };
double init_lm[5] = {-0.117798518453, 0.147554949385, -0.0549082041898, 0, 0};
double init_ri[9] = 
    {   478.640315323, 0, 299.957994781, 
    0, 477.898896505, 251.665771947, 
    0, 0, 1};
double init_rm[5] = {-0.10884732532, 0.12118405303, -0.0322073237741, 0, 0};
double init_r[9] = 
    {   0.999973709051976, 0.00129700728791757, -0.00713435189275776,
    -0.00132096594266573, 0.999993501087837, -0.00335452397041856, 
    0.00712995468519435, 0.00336386001267643, 0.99996892361313};
double init_t[3] = {-0.0830973040641153, -0.00062704210860633, 1.4287643345188e-005};

cv::Mat li(3, 3, CV_64FC1, init_li);
cv::Mat lm(5, 1, CV_64FC1, init_lm);
cv::Mat ri(3, 3, CV_64FC1, init_ri);
cv::Mat rm(5, 1, CV_64FC1, init_rm);
cv::Mat r, t, Rl, Rr, Pl, Pr; // note: no initialization needed.

//frame is a cv::MAT holding the first frame of the video.
cv::Size imageSize = frame.size();
imageSize.width /= 2;

//IT won't break HERE
cv::stereoRectify(li, ri, lm, rm, imageSize, r, t, Rl, Rr, Pl, Pr);

// no need ever to release or care about anything
于 2013-03-19T18:10:45.110 に答える