【问题标题】:How to convert Mat image to vector<Point>如何将 Mat 图像转换为矢量<Point>
【发布时间】:2015-08-11 14:04:11
【问题描述】:

有什么方法可以将 Mat 图像转换为矢量?

这不起作用:

Mat input = imread("image.png");
vector<Point> points;

points = input;

【问题讨论】:

  • OpenCV 中没有这样的转换并不奇怪,因为将图像表示为矢量 效率极低。但是,如果您仍然需要它,是什么阻止您编写 2-4 行代码来执行此转换?
  • 图像有点,每个点都包含数据。一个 8 位黑白图像有 WxH 点,每个点都有一个 UCHAR 值。学习this.

标签: c++ opencv


【解决方案1】:

您可以轻松地手动完成,直接使用垫子的行/列索引创建点:

//Create a blank mat of size 3x3 and an empty point vector
cv::Mat img = cv::Mat::zeros(cv::Size(3, 3), CV_8UC3);
std::vector<cv::Point> points;

//Loop over each pixel and create a point
for (int x = 0; x < img.cols; x++)
    for (int y = 0; y < img.rows; y++)
        points.push_back(cv::Point(x, y));

//Print out results
for (cv::Point p : points)
    std::cout << p << "\n";

但我不明白你为什么需要这样做,你已经知道矩阵中的点,因为你可以访问它的大小。

【讨论】:

  • 我认为Point有成员“价值”。
  • 是否要访问像素的颜色通道?
  • 我有二值图像,想测量 Hausdorff 距离来比较两个图像,并且需要矢量中的黑色像素。我这样做:extractChannel(input,input,0); findNonZero(输入,点);但我不知道为什么白色像素具有非零值而不是黑色。
  • 每个通道(通常)有 8 位,范围从 0 到 255。0 值表示黑色像素,255 值表示白色像素。如果您想找到黑色像素,您可以按位执行不要将黑色翻转为白色,然后执行 findNonZero() 来查找点。编辑 - 对于二进制图像,每个像素只有两个可能的值 0 - 1(而不是 0 - 255),但想法是一样的。
  • 如果只有两个可能的像素值,您就已经有了一个二值图像。 OpenCV 必须为二进制图像使用 8 位通道,这就是为什么你得到 0 (00000000) 和 255 (11111111) 作为你的两个可能值的原因。一个 1 位通道会给你 0 和 1,但它不会有什么不同,你仍然只有黑白像素。如果你仍然有问题提出一个新问题,我会尽可能写一个例子。编辑 - 要获取通道值,请使用 img.at(point)
【解决方案2】:

请说明您希望如何将图像转换为点。你的向量中的每个点会持有什么?

您可以通过遍历矩阵来填充向量。

您可以通过构造函数将 3x1,1x3 或 1x2, 2x1 Mat 数组分配给 Point2f, Point3f 结构。

这个帖子可能会有所帮助, Conversion of 3x1 or 1x3 cv::Mat to cv::Point3d?

【讨论】:

  • Point 有两个元素 x、y 或三个元素 x、y、z 在 Point3i、Point3f 的情况下。如果需要表示像素的颜色值,可以使用 Scalar 代替。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-15
  • 1970-01-01
  • 2016-04-27
  • 1970-01-01
  • 1970-01-01
  • 2015-02-17
  • 1970-01-01
相关资源
最近更新 更多