1

cv::projectPoints を使用して、3D ポイントのベクトルの対応するピクセルを取得しています。

ポイントはすべて互いに近くにあります。

問題は、いくつかのポイントでは正しいピクセル座標が得られることですが、他のポイントでは -22599 のような奇妙な負の値が得られることです...

cv::projectPoints が負の値を返すのは正常ですか、それとも私のコードのバグですか?

void SingleCameraTriangulator::projectPointsToImage2(const std::vector< cv::Vec3d >& pointsGroup, const double scale, std::vector< Pixel >& pixels)
{
    cv::Vec3d 
        t2, r2;

    decomposeTransformation(*g_12_, r2, t2);

    cv::Mat imagePoints2;

    cv::projectPoints(pointsGroup, r2, t2, *camera_matrix_, *distortion_coefficients_, imagePoints2);

    for (std::size_t i = 0; i < imagePoints2.rows; i++)
    {
        cv::Vec2d pixel = imagePoints2.at<cv::Vec2d>(i);
        Pixel p;
        p.x_ = pixel[0];
        p.y_ = pixel[1];
        if ( (p.x_ < 0) || (p.x_ > ((1 / scale) * img_1_->cols)) || (p.y_ < 0) || (p.y_ > ((1/scale) * img_1_->rows)))
        {
            cv::Vec3d point = pointsGroup[i];
            std::cout << point << " - " << pixel << " - " << pixel*scale << "problema" << std::endl;
        }
        p.i_ = getBilinearInterpPix32f(*img_2_, scale * p.x_, scale * p.y_);

        pixels.push_back(p);
    }
}

ご提案いただきありがとうございます。

4

1 に答える 1

1

reprojectImageTo3D (3D ポイントを取得するために使用しますか?) は、外れ値ポイントに大きな z 座標 (10000) を与えるため、問題はここにあると思います。

于 2013-08-12T18:21:12.380 に答える