2013-01-11 91 views
7

Tôi cần giải quyết vấn đề khi tôi phát hiện hình chữ nhật với các góc được làm tròn bằng cách sử dụng opencv. Về cơ bản tôi đang sử dụng cùng squares.c mẫu mã:Phát hiện điểm góc từ hình chữ nhật với các góc bo tròn

cvFindContours(gray, storage, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE); 
while(contours) 
{ 
    double area=fabs(cvContourArea(contours, CV_WHOLE_SEQ)); 
    if(area < minimum_area || area > maximum_area) { 
     contours = contours->h_next; 
     continue; 
    }    
    result = cvApproxPoly(contours, sizeof(CvContour), storage, 
     CV_POLY_APPROX_DP, cvContourPerimeter(contours)*0.05, 0); 
    if(result->total == 4 && 
     fabs(cvContourArea(result,CV_WHOLE_SEQ)) > 1000 && 
     cvCheckContourConvexity(result)) 
     { 

Với mã này, tôi thường có thể phát hiện các hình ảnh, nhưng tôi cần phải điều chỉnh phối cảnh của hình ảnh và cho rằng tôi cần phải phát hiện các góc của hình ảnh , làm thế nào để làm điều này và hình ảnh đã làm tròn góc? Vấn đề xảy ra vì điểm tôi không cần phát hiện giữa các điểm, ví dụ, tôi tạo ra hình ảnh sau đây, nơi các đường màu đen biểu diễn các điểm được phát hiện bởi mã hiện tại và các dấu chấm màu xanh là những điểm tôi cần?

enter image description here

Thank cho bất kỳ sự giúp đỡ.

+0

Bằng "Tôi cần giải quyết vấn đề", ý của bạn là "Tôi muốn một hàm OpenCV sẵn sàng giải quyết vấn đề của tôi"? Vấn đề của bạn được giải quyết bằng cách đặt hàng thông minh đơn giản của các điểm đen. Từ đó bạn xây dựng bốn góc màu xanh lam. – mmgp

+0

@mmgp đặt hàng các điểm đen? Nhưng điểm đen không chứa điểm xanh! – Ricardo

+0

Tôi tìm thấy giải pháp ở đây: http://stackoverflow.com/questions/22519545/automatic-perspective-correction-opencv – delkant

Trả lời

0

Thử chia tỷ lệ hình ảnh thành kích thước nhỏ hơn bằng lệnh cvResize và áp dụng mã đó cho nó. Về mặt lý thuyết, giảm kích thước hình ảnh sẽ làm sắc nét các góc hình ảnh và giảm vấn đề của bạn với chi phí mất chính xác.

+0

Một lưu ý, điều này hoạt động khá tốt, nhưng bạn cần phải chắc chắn sử dụng một thiết lập nội suy phong nha khi thay đổi kích thước như vậy như 'khối' không phải là 'hàng xóm gần nhất'. –

2

Trong thuật ngữ OpenCV, trước tiên hãy tìm hình chữ nhật màu đen bằng cách sử dụng FindContours với RETR_EXTERNALCHAIN_APPROX_SIMPLE. Bây giờ bạn tìm thấy hộp giới hạn tối thiểu của hình chữ nhật tròn này bằng cách sử dụng minAreaRect trên các điểm được tìm thấy bởi FindContours. Để có được các góc của hộp giới hạn này, hãy sử dụng hàm BoxPoints khi trả về (trung tâm, (chiều rộng, chiều cao), góc quay) của minAreaRect. Bây giờ bạn có bốn góc của đường màu đỏ bạn đang sau.

+0

minAreaRect sẽ thực sự trả lại một hình chữ nhật chứ không phải một tứ giác như trong ví dụ kết quả mong muốn của đường màu đỏ. – Wicpar

0

Tôi gặp sự cố và không có câu trả lời nào khác hữu ích. Trong trường hợp của tôi, tôi đã quan sát các datamatrices chính xác, trong đó có một góc bị thiếu ở phía trên bên phải, trông được làm tròn trên một phát hiện harris.

Để khắc phục điều này, hãy phát hiện hình dạng theo bất kỳ cách nào bạn thích, sau đó lấy vỏ lồi của đường bao. Một khi bạn có nó, bạn sẽ phải trích xuất 4 dòng dài nhất (không có chức năng opencv tồn tại, bạn phải thực hiện chức năng trích xuất của riêng bạn) Sau đó, bạn chỉ cần nhận được giao điểm của 4 dòng (chức năng của riêng bạn) và chuyển đổi nó trở lại vào ma trận để hiệu chỉnh phối cảnh.

Nếu phương tiện của bạn có thể bị cong hoặc phát hiện có thể không hoàn hảo, bạn có thể cũng muốn xóa các điểm khỏi đường bao có góc cao so với các điểm lân cận, có thể tạo ra độ lệch trong các điểm cuối cùng.

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