显示cv2 Mat的差异

时间:2018-11-06 06:06:32

标签: c++ opencv mat

为什么将整个矩阵Mat和矩阵显示为单个元素时会有区别?

cv::Point2f sour[4] = {Point(530,430), Point(670, 320), Point(870,430), Point(980, 320)};
cv::Point2f dest[4] = {Point(450,530), Point(450,420), Point(550,530), Point(550,420)};

cv::Mat hom(3, 3, CV_32F);
hom=getPerspectiveTransform(sour,dest);

cout << "hom: " <<hom << endl;

打印

hom: [0.4489795918367541, 1.122448979591883, -33.67346938776892;
  5.034167527284694e-15, 2.040816326530671, -68.48979591837563;
  1.505685767039244e-17, 0.001224489795918431, 1]

同时

for (int i1=0; i1<3; i1++){
    for (int i2=0; i2<3; i2++){
            cout << hom.at<float>(i1,i2) << " ";
        }
        cout <<endl;
    }

打印:

-1.32615e+23 1.72449 1.70011e-29 
0 0.0301113 -2.30304e-37 
0 0.0147314 -3.2706e+24 

1 个答案:

答案 0 :(得分:2)

我看到的可能性是,在分配矩阵类型(float之后,矩阵类型从double更改为hom=getPerspectiveTransform(sour,dest);。如果真是这样,那么CV_Assert(hom.type() == cv::DataType<float>::type);将引发异常。

要解决此问题,您需要使用正确的类型(可能是double)来引用矩阵元素。因此,在打印矩阵时,将hom.at<float>替换为hom.at<double>,看看是否有帮助。

顺便说一句,我认为没有理由像cv::Mat hom(3, 3, CV_32F);这样先声明矩阵。您可能可以直接执行cv::Mat hom = getPerspectiveTransform(sour, dest);

此问题的另一个解决方案是使用静态类型的矩阵,即 cv::Matx<float, 3, 3> hom = getPerspectiveTransform(sour, dest);。 OpenCV将自动将getPerspectiveTransform返回的值转换为分配中的正确类型。然后,在打印元素时,可以将hom.at<float>(i1, i2)替换为hom(i1, i2),因为现在可以静态知道元素类型。

更新: <<运算符似乎以大约16个十进制数字打印hom矩阵的元素,这表明精度为double。对于单精度(float),大约应为7个十进制数字。