【发布时间】:2012-06-15 17:54:56
【问题描述】:
我无法让 cv::line 绘制一条设置了 CV_AA 标志的抗锯齿线。下面是示例代码来说明:
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
int main(int argc, char* argv[])
{
cv::Mat base(100, 100, CV_32F);
cv::Point2i p1(20, 20);
cv::Point2i p2(70, 90);
cv::line(base, p1, p2, cv::Scalar(1.0), 1, CV_AA); // 1 pixel thick, CV_AA == Anti-aliased flag
cv::namedWindow("line test", CV_NORMAL);
cv::imshow("line test", base);
cv::waitKey(0);
return 0;
}
我尝试使用 cv::Point2d 代替 cv::Point2i 并没有发现任何区别。 (i == integer, d == double) 我也试过让像素宽度大于1,但还是没有AA。
但是,这确实适用于 CV_8U(8 位无符号)图像,而不是我这里的 CV_32F(32 位浮点)图像。 (对于 CV_8U,您必须将 cv::Scalar(255) 而不是 cv::Scalar(1.0) 传递给 line 函数进行比较)
我想当前的解决方法是从 CV_8U 图像开始然后进行转换,但有没有一种直接的方法可以只使用不需要我编写自己的抗锯齿功能的 CV_32F 图像来实现?
我错过了什么吗?
OpenCV 文档:cv::line reference
【问题讨论】:
-
这可能是 OpenCV 中的一个问题,但我想指出一段奇怪的代码:您可以将 cv::namedWindow 和 cv::imshow 移到循环外,保持相同的功能速度更快。
-
啊,是的,好点。我把这个问题放在一起。
-
其实可以这样写 c = cv::waitKey();返回0;当你按下一个键时,waitKey() 将返回并关闭程序。
-
是的,但是您无法使用鼠标光标调整图像大小并仔细查看线条。这就是循环背后的目的。另一种方法是使用窗口的线程版本,但我想保持简单。
-
嗯,我试过了,你仍然可以这样调整窗口大小。所以,你是对的。对于通常将数字 > 0 传递给 cv::waitKey 的其他应用程序,例如显示视频,它不起作用,因为在分配的时间之后没有更多更新。我不记得过去在那里。按照您的建议修改了代码。
标签: opencv