c++ - 显示 cv2 垫的差异

标签 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 

最佳答案

我看到的可能性是矩阵类型从 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)因为元素类型现在是静态已知的。

更新: << 的事实运算符似乎打印了 hom 的元素具有大约 16 位十进制数字的矩阵表明精度为 double .对于单精度 ( float ),它应该是大约 7 位小数。

关于c++ - 显示 cv2 垫的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53166549/

相关文章:

c++ - 编码霍夫曼二叉树

具有聚合初始化的 C++ 常量匿名实例

OpenCV 2.2 和多 CPU - opencv_haartraining.exe 是多线程的吗?

c++ - OpenCV:如何读取 float 图像

opencv - 将 Mat (OpenCV) 的数据保存在指针所在的 memoryarea 上

c++ - 大于 100,000 的随机数

C++ 未处理的异常 : An invalid parameter was passed to a function that considers invalid parameters fatal

c - OpenCV(C语言)围绕白色区域画圈

python - 捕获感兴趣的区域

java - 使用 JavaCV API 访问 Mat 的像素值