使用 cv::circle 在带有 openCV 的 c++ 中的迭代器上绘制

问题描述 投票:0回答:2

我正在创建一条迭代器线,我通过

for()
并用
cv::circle
点绘制。到目前为止一切顺利,通过迭代器的线条点形成线条图。但是左上角有一个小图不是我的本意,有谁知道我哪里错了吗?

std::vector<cv::Point> createLineIterator(cv::Mat &frame)
{
    cv::Point p1(400, 0);
    cv::Point p2(200, 800);

    cv::LineIterator line(frame, p1, p2, 8);
    std::vector<cv::Point> points(line.count);
    for (int i = 0; i <= line.count; i++, ++line)
    {
        points.push_back(line.pos());
    }
    return points; //points that I will iterate over to create circles and draw the line
}
int main(int argc, char const *argv[])
{
    cv::Mat image(500, 1000, CV_8UC1); // cria imagem

    std::vector<cv::Point> points = createLineIterator(image);
    for (auto i : points)
    {
        cv::circle(image, i, 2, cv::Scalar(255, 100, 255)); //Point-by-point drawing of the iterator line
    }

    cv::imshow("image", image);
    cv::waitKey(0);
    return 0;
}
c++ opencv iterator line draw
2个回答
0
投票

我通过从函数返回两个 cv::Point 得到它

std::pair<std::pair<cv::Point, cv::Point>, std::vector<cv::Point>> createLineIterator(cv::Mat &frame){...}

我打电话给 main

cv::line(image, points.first.first, points.first.second, cv::Scalar(255, 0, 0));

之前不知道是什么原因用

cv::circle
画的,但是用
cv::line

看到乱画不存在了

0
投票

这是

createLineIterator
的正确版本,它将消除工件:

std::vector<cv::Point> createLineIterator(cv::Mat &frame)
{
    cv::Point p1(400, 0);
    cv::Point p2(200, 800);
    cv::LineIterator line(frame, p1, p2, 8);
    std::vector<cv::Point> points(line.count);
    for (int i = 0; i < line.count; i++, ++line)
    {
        points[i] = line.pos();
    }
    return points; //points that I will iterate over to create circles and draw the line
}

一些解释:

在函数内的第 4 行(与您的代码中相同),我们在

line.count
中分配
std::vector
元素。 这就是在
line.count
里面写
()
的意思。

在循环中使用

push_back
(就像你所做的那样)将元素添加到向量中, 除了在构造行中分配的那些(函数中的第 4 行)。 最终元素数量翻倍,前半部分默认构造为 (0,0).

(0,0) 圆圈 是您观察到的人工制品。

相反,我分配给已经分配的元素:

points[i] = line.pos();

注意 - 您也可以使用

std::vector
的默认构造函数,然后使用
push_back
添加元素。 但是因为你提前知道元素的数量,所以效率较低。

另一个重要的问题是循环索引是

< line.count
,而不是代码中的
<= line.count
。 这是因为
std::vector
索引是 0..(n-1),其中 n 是元素的数量。

© www.soinside.com 2019 - 2024. All rights reserved.