从 Vector<point2f> 创建 Mat 断言失败错误

Posted

技术标签:

【中文标题】从 Vector<point2f> 创建 Mat 断言失败错误【英文标题】:Create Mat from Vector<point2f> Assertion failed error 【发布时间】:2016-07-20 16:38:08 【问题描述】:

我试图将 Point2f imagePoints 写入 openCV 中的 Mat 图像。我正在关注下面的链接。

Create Mat from vector<point2f>

但我收到“断言失败”错误。请帮忙。

代码:

std::vector<cv::Point3d> objectPoints;
std::vector<cv::Point2d> imagePoints;

cv::Mat intrisicMat(3, 3, cv::DataType<double>::type);
intrisicMat.at<double>(0, 0) = param.focalLength.first;
intrisicMat.at<double>(0, 1) = 0;
intrisicMat.at<double>(0, 2) = param.principalPoint.first;

intrisicMat.at<double>(1, 0) = 0;
intrisicMat.at<double>(1, 1) = param.focalLength.second;
intrisicMat.at<double>(1, 2) = param.principalPoint.second;

intrisicMat.at<double>(2, 0) = 0;
intrisicMat.at<double>(2, 1) = 0;
intrisicMat.at<double>(2, 2) = 1;

cv::Mat rVec(3, 1, cv::DataType<double>::type); // Rotation vector
rVec.at<double>(0) = 0;
rVec.at<double>(1) = 0;
rVec.at<double>(2) = 0;

cv::Mat tVec(3, 1, cv::DataType<double>::type); // Translation vector
tVec.at<double>(0) = 0;
tVec.at<double>(1) = 0;
tVec.at<double>(2) = 0;

cv::Mat distCoeffs(5, 1, cv::DataType<double>::type);   // Distortion vector
distCoeffs.at<double>(0) = param.distortionRadial.at(0);
distCoeffs.at<double>(1) = param.distortionRadial.at(1);
distCoeffs.at<double>(2) = param.distortionTangential.first;
distCoeffs.at<double>(3) = param.distortionTangential.second;
distCoeffs.at<double>(4) = param.distortionRadial.at(2);


projectPoints(objectPoints, rVec, tVec, intrisicMat, distCoeffs, imagePoints);
Mat depthImage = Mat(imagePoints);
imwrite("E:/softwares/1.8.0.71/bin/depthImage.jpg", depthImage);
cout << "depthImage.channels()=" << depthImage.channels() << endl;

错误:

OpenCV Error: Assertion failed (image.channels() == 1 || image.channels() == 3 || image.channels() == 4) in cv::imwrite_, file E:\softwares\opencv-3.1.0\opencv-3.1.0\modules\imgcodecs\src\loadsave.cpp, line 455

我的图像有 2 个通道。所以 ImWrite() 抛出断言失败错误。如果不是这样,如何使用图像点创建 Mat 图像?

【问题讨论】:

请显示您的代码和完整的错误日志。 OpenCV 错误:在 cv::imwrite_ 文件中断言失败 (image.channels() == 1 || image.channels() == 3 || image.channels() == 4) E:\softwares\opencv-3.1.0\opencv-3.1.0\modules\imgcodecs\src\loadsave.cpp,第 455 行 这是我的代码.. projectPoints(objectPoints, rVec, tVec, intrisicMat, distCoeffs, imagePoints);垫点垫 = 垫(图像点); imwrite("E:/softwares/1.8.0.71/bin/depthImage.png", pointsMat); 【参考方案1】:

根据您在 cmets 中写入的内容,您似乎正试图将您的 Mat 写入文件。问题是,Vector&lt;Point2f&gt; 中的 Mat 将给出一个 2 通道矩阵,它与任何图像格式(灰度、RGB 或 RGBA)都不兼容。

此外,请编辑您的主要帖子以显示代码(使用降价),以便更容易阅读并为您提供帮助。

【讨论】:

那么如何使用这些数据创建 Mat 图像? 你能指出这 2 个通道 Mat 的含义吗?它应该显示为图像是什么?如果您只是想将值保存为序列化的 Mat 对象,则 cv::FileStorage 类的目的是保存为 XML 或 YML 格式(请参阅:docs.opencv.org/2.4/modules/core/doc/xml_yaml_persistence.html)。 我的目标是将 3D 凝块点转换为 2D 图像数据。我想保存 2D 图像以可视化 2D 深度图像。 如果我明白你想要什么,你得到的 Mat 对象将 3D 点云的每个 3D 坐标链接到 imagePoints 中的 2D 坐标。因此,您需要遍历 imagePoints 的每 2 个通道元素,获取 (x,y) 值并将其用作另一个矩阵(例如,二进制图像 (CV_8U))上的索引并设置 ( x,y) 元素值为 255。

以上是关于从 Vector<point2f> 创建 Mat 断言失败错误的主要内容,如果未能解决你的问题,请参考以下文章

直接减去两个vector<point2f>

Mat 或 vector<Point2f> 哪种类型更适合与函数 estimateRigidTransform() 一起使用?

OpenCV2.4.2将vector<Point2f>转换为Mat,释放mat会报错

Algorithm参数记录

如何使用文件存储从 xml 文件中读取矢量<vector<Point3f>>

将openCV矩阵转换为向量