2015-12-06 13 views
5

Tôi đang cố gắng để xoay hình ảnh sử dụngLàm thế nào để duy trì nền trắng khi sử dụng opencv warpaffine

void rotate(cv::Mat& src, double angle, cv::Mat& dst) 
{ 
    int len = std::max(src.cols, src.rows); 
    cv::Point2f pt(len/2., len/2.); 
    cv::Mat r = cv::getRotationMatrix2D(pt, angle, 1.0); 
    cv::warpAffine(src, dst, r, cv::Size(src.cols, src.rows)); 
} 

bằng cách cho góc, nguồn và hình ảnh đích. Xoay hoạt động chính xác như sau.

enter image description here

Tôi muốn tạo vùng trắng đen. Tôi đã thử với

cv::Mat dst = cv::Mat::ones(src.cols, src.rows, src.type()); 

trước khi gọi xoay, nhưng không thay đổi kết quả. Làm thế nào tôi có thể đạt được điều này?

Lưu ý: Tôi đang tìm giải pháp đạt được điều này trong khi thực hiện xoay vòng. rõ ràng bằng cách làm cho các khu vực màu đen trắng sau khi quay này có thể đạt được.

Trả lời

12

Bạn sẽ muốn sử dụng các đối số borderModeborderValue của hàm warpAffine để thực hiện điều này. Bằng cách đặt chế độ thành BORDER_CONSTANT, chế độ này sẽ sử dụng giá trị không đổi cho các pixel viền (ví dụ: bên ngoài hình ảnh) và bạn có thể đặt giá trị thành giá trị không đổi bạn muốn sử dụng (ví dụ: màu trắng). Nó sẽ giống như thế:

cv::warpAffine(src, dst, r, 
       cv::Size(src.cols, src.rows), 
       cv::INTER_LINEAR, 
       cv::BORDER_CONSTANT, 
       cv::Scalar(255, 255, 255)); 

Để biết thêm chi tiết, xem OpenCV API Documentation.

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