从直线中提取坐标数组(c++ OpenCV)

Extract Array of Coordinates from Line (C++ OpenCV)

本文关键字:c++ OpenCV 数组 坐标 提取      更新时间:2023-10-16

使用c++/OpenCV我使用cv::line在图像上画了一条线,现在我试图提取其坐标数组。我试过将行分配给cv::Mat,但我得到一个错误,说明我不能从void转换为cv::Mat。有没有一种简单的方法来获得这些坐标?

谢谢你的帮助!

您至少有几个选择。假设您知道这条线的两个端点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;
}

您可以看到这个答案。我想这就是你的问题所需要的,在一条直线上找点。

Opencv有行迭代器功能。仔细阅读文档!

这是一个示例用法!

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
}