显示 cv2 垫的差异
Difference in displaying cv2 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
我看到的可能是矩阵类型在分配后从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 位小数。
为什么在显示整个矩阵 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
我看到的可能是矩阵类型在分配后从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 位小数。