2012-06-15 66 views
7

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

+1

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

+0

Ah, vâng, điểm tốt. Tôi đã ném nó lại với nhau cho câu hỏi. –

+1

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

Trả lời

5

Bạn có thể cung cấp hình ảnh mẫu không? Tôi cũng đã thử nó bản thân mình và nó làm việc hoàn toàn tốt đẹp với mã này:

#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); 
} 

That'y kết quả của tôi:
enter image description here

+0

Đây là dòng AA và những gì tôi nhận được khi đặt hình ảnh cơ sở thành CV_8U: http://imgur.com/4wlea. Đây là một dòng không AA, và những gì tôi nhận được khi thiết lập hình ảnh cơ sở cho CV_32F, mặc dù CV_AA được chuyển vào cv :: line function: http://imgur.com/MSogk. Bạn đang sử dụng hình ảnh CV_8U trong ví dụ của mình. Tôi muốn các chức năng để làm việc cho CV_32F. –

7
./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 
} 

Mã nguồn nói rằng miễn là độ sâu không phải là CV_8U , nó sẽ vẽ bằng phương pháp kết nối 8.

Các vấn đề liên quan