从线条中提取坐标数组(C++ OpenCV)

5
使用C++ / OpenCV,我使用cv :: line在图像上画了一条线,现在我想提取其坐标数组。我尝试将该行分配给cv :: Mat,但是我得到一个错误,指出我无法从void转换为cv :: Mat。有没有简单的方法可以获得这些坐标?
谢谢帮忙!

你说的坐标数组是什么意思?你需要线的四个角吗?输出需要什么类型? - Ali Mirzaei
2个回答

5
您至少有两个选项。假设您知道线段的两个端点AB
1)使用line(...)在与图像相同大小的零初始化掩模上绘制线,并使用findNonZero(...)检索线上的点(这些点将是掩模上唯一的白色点)。
2)使用LineIterator检索点,无需绘制它们或创建掩模。
您需要将点存储在vector<Point>中。
#include <opencv2/opencv.hpp>
#include <vector>

using namespace std;
using namespace cv;

int main(int, char** argv)
{
    Mat3b image(100,100); // Image will contain your original rgb image

    // Line endpoints:
    Point A(10,20);
    Point B(50,80);


    // Method: 1) Create a mask
    Mat1b mask(image.size(), uchar(0));
    line(mask, A, B, Scalar(255));

    vector<Point> points1;
    findNonZero(mask, points1);

    // Method: 2) Use LineIterator
    LineIterator lit(image, A, B);

    vector<Point> points2;
    points2.reserve(lit.count);
    for (int i = 0; i < lit.count; ++i, ++lit)
    {
        points2.push_back(lit.pos());
    }

    // points1 and points2 contains the same points now!

    return 0;
}

非常有用和详尽的答案 - 非常感谢!我接受这个答案,因为它包含了其他用户的多种选择,如果他们的情况略有不同于我的。 - MSTTm

3
您可以查看这个答案。我认为这就是您问题所需的内容:在一条线上找到点
Opencv有一个Line Iterator函数。请阅读文档!
以下是示例用法!
LineIterator it(img, pt1, pt2, 8);
for(int i = 0; i < it.count; i++, ++it)
{
    Point pt= it.pos(); 
   //Draw Some stuff using that Point pt
}

2
我没有给你点踩,但这篇帖子现在更有用了。(而且如果链接失效,它也会保存下来):) - Luke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接