在OpenCV中使用CV_AA标志绘制直线不会生成抗锯齿直线

在OpenCV中使用CV_AA标志绘制直线不会生成抗锯齿直线,opencv,Opencv,我无法让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绘制设置了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;
}
#包括
#包括
使用名称空间std;
int main(int argc,char*argv[])
{
cv::垫基(100100,cv_32F);
cv::第2i点p1(20,20);
cv::点2i p2(70,90);
cv::line(基、p1、p2、cv::Scalar(1.0)、1、cv_AA);//1像素厚,cv_AA==抗锯齿标志
cv::namedWindow(“直线测试”,cv_正常);
cv::imshow(“线路测试”,基础);
cv::waitKey(0);
返回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)传递到要比较的行函数中)

我想当前的解决方法是先使用CV_8U图像,然后进行转换,但有没有一种简单的方法可以只使用CV_32F图像,而不需要我编写自己的抗锯齿函数

我错过什么了吗


OpenCV文档:

您能提供一个示例图像吗?我自己也试过了,这段代码运行得非常好:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

int main(int argc, char *argv[])
{
  cv::Mat img = cv::Mat::zeros(500, 500, CV_8UC3);

  // red line, which is not anti-aliased
  cv::line(img, cv::Point(100, 100), cv::Point(400, 105), cv::Scalar(0,0,200), 3, 4);  

  // green line, which is not anti-aliased
  cv::line(img, cv::Point(100, 200), cv::Point(400, 205), cv::Scalar(0,200,0), 5, 8);

  // blue line, which is anti-aliased
  cv::line(img, cv::Point(100, 300), cv::Point(400, 305), cv::Scalar(200,0,0), 10, CV_AA);

  cv::namedWindow("drawing", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
  cv::imshow("drawing", img);

  cv::waitKey(0);
}
#包括
#包括
int main(int argc,char*argv[])
{
cv::Mat img=cv::Mat::Zero(500500,cv_8UC3);
//红线,未消除混叠
cv::line(img,cv::Point(100100),cv::Point(400105),cv::Scalar(0,0200),3,4);
//绿线,它不是抗锯齿的
cv::line(img,cv::Point(100200),cv::Point(400205),cv::Scalar(0200,0),5,8);
//蓝线,抗锯齿
cv::line(img,cv::Point(100300),cv::Point(400305),cv::Scalar(200,0,0),10,cv_AA);
cv::namedWindow(“绘图”,cv_窗口|自动大小| cv_窗口_自由比率);
cv::imshow(“图纸”,img);
cv::waitKey(0);
}
这就是我的结果:


源代码指出,只要深度不是CV_8U,它就会使用8-connected方法绘制。

这在OpenCV中可能是个问题,但我想向您指出一段奇怪的代码:您可以将CV::namedWindow和CV::imshow移动到外部循环,保持相同的功能以获得更好的速度。啊,是的,很好。实际上,你可以写c=cv::waitKey();返回0;当您按下一个键时,waitKey()将返回并关闭程序。是的,但您不能用鼠标光标调整图像大小并更仔细地查看线条。这就是循环背后的目的。另一种选择是使用线程版本的窗口,但我想保持这个简单。嗯,我试过了,你仍然可以这样调整窗口的大小。所以,你是对的。对于通常将大于0的数字传递到cv::waitKey的其他应用程序,如显示视频,它不起作用,因为在分配的时间之后没有更多更新。我不记得过去在那里了。按照您的建议修改了代码。这是AA行,我在将基本图像设置为CV_8U时得到的结果:。这是一个非AA行,我在将基本图像设置为CV_32F时得到的,尽管CV_AA被传递到CV::line函数:。您在示例中使用的是CV_8U图像。我希望该函数适用于CV_32F。那么有没有办法在非CV-8U图像中使用CV_AA?
./core/src/drawing.cpp:1569
void line( Mat& img, Point pt1, Point pt2, const Scalar& color,
       int thickness, int line_type, int shift )
{
    if( line_type == CV_AA && img.depth() != CV_8U )
        line_type = 8;
    //omitted
}