Tôi không thể nhận cv :: line để vẽ đường kẻ được đặt bí danh với cờ CV_AA được đặt. Dưới đây là ví dụ để minh họa:Vẽ một đường thẳng trong OpenCV với cờ CV_AA không tạo ra đường chống răng cưa
#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;
}
Tôi đã thử sử dụng cv :: Point2d thay vì cv :: Point2i và không tìm thấy sự khác biệt. (i == số nguyên, d == đôi) Tôi cũng đã cố gắng làm cho chiều rộng pixel lớn hơn 1, nhưng vẫn không có AA.
Tuy nhiên, điều này không hoạt động với hình ảnh CV_8U (8 bit không dấu), trái với hình ảnh CV_32F (hình nổi 32 bit) mà tôi có ở đây. (Đối với CV_8U, bạn phải vượt qua cv :: Scalar (255) thay vì cv :: Scalar (1.0) vào hàm line để so sánh)
Tôi giả sử một work-around hiện tại sẽ bắt đầu với một ảnh CV_8U chuyển đổi, nhưng là có một cách đơn giản để làm điều đó chỉ với một hình ảnh CV_32F mà không yêu cầu tôi viết chức năng chống răng cưa của riêng tôi?
Tôi có thiếu gì đó không?
Tài liệu OpenCV: cv::line reference
Nó có thể là một vấn đề trong OpenCV, nhưng tôi muốn chỉ cho bạn một đoạn mã lạ: bạn có thể di chuyển cv :: namedWindow và cv :: imshow bên ngoài vòng lặp, giữ chức năng tương tự cho tốc độ tốt hơn nhiều. – Sam
Ah, vâng, điểm tốt. Tôi đã ném nó lại với nhau cho câu hỏi. –
thực sự, bạn có thể viết c = cv :: waitKey(); trả về 0; Khi bạn bấm một phím, waitKey() sẽ trở lại và đóng chương trình. – Sam