我正在创建一条迭代器线,我通过
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;
}
这是
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 是元素的数量。