我无法让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 ==整数,d == double)我也尝试使像素宽度大于1,但仍然没有AA。
然而,这适用于CV_8U(8位无符号)图像,而不是我在这里的CV_32F(32位浮点)图像。 (对于CV_8U,必须将cv :: Scalar(255)而不是cv :: Scalar(1.0)传递给行函数进行比较)
我想当前的解决方法是从CV_8U图像开始然后转换,但有一种直接的方法来做一个CV_32F图像,不需要我编写自己的抗锯齿功能?
我错过了什么吗?
OpenCV docs:cv::line reference
答案 0 :(得分:10)
./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
}
源代码指出,只要深度不是CV_8U,就会使用8连接方法进行绘制。
答案 1 :(得分:7)
您能提供样本图片吗?我也亲自尝试过,这段代码完全正常:
#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);
}
那是我的结果: