2012-01-03 13 views
15

Tôi đang cố gắng phát hiện xem 2 Khu vực Ưa thích (CvRect s) có giao nhau với nhau trong OpenCV hay không. Tôi rõ ràng có thể gõ một số điều kiện (hoặc khá nhiều) điều kiện để kiểm tra bằng tay, nhưng đó không thực sự là một cách hay để thực hiện nó (imo).Làm thế nào để dễ dàng phát hiện 2 đường giao nhau có bị cắt trong OpenCv?

Có ai có thể đề xuất cho tôi bất kỳ giải pháp nào khác không? Có một phương pháp sẵn sàng trong OpenCV cho điều đó không?

Trả lời

28

Tôi không biết về bất kỳ giải pháp làm sẵn cho giao diện C (CvRect), nhưng nếu bạn sử dụng ++ cách C (cv::Rect), bạn có thể dễ dàng nói

interesect = r1 & r2; 

Các complete list hoạt động trên hình chữ nhật là

// In addition to the class members, the following operations 
// on rectangles are implemented: 

// (shifting a rectangle by a certain offset) 
// (expanding or shrinking a rectangle by a certain amount) 
rect += point, rect -= point, rect += size, rect -= size (augmenting operations) 
rect = rect1 & rect2 (rectangle intersection) 
rect = rect1 | rect2 (minimum area rectangle containing rect2 and rect3) 
rect &= rect1, rect |= rect1 (and the corresponding augmenting operations) 
rect == rect1, rect != rect1 (rectangle comparison) 
+0

Hmmm ... bạn có biết làm thế nào tôi có thể cast CvRect vào cv :: Rect? – Patryk

+0

'Rect r = myCvRect; 'Có khó không? – Sam

+0

Tôi đã thử toán tử & và tôi chỉ gặp lỗi biên dịch: 'lỗi: sử dụng không hợp lệ thành viên (bạn đã quên‘ & ’?)' Khi rõ ràng tôi có &. – achow

5
bool cv::overlapRoi(Point tl1, Point tl2, Size sz1, Size sz2, Rect &roi) 
{ 
    int x_tl = max(tl1.x, tl2.x); 
    int y_tl = max(tl1.y, tl2.y); 
    int x_br = min(tl1.x + sz1.width, tl2.x + sz2.width); 
    int y_br = min(tl1.y + sz1.height, tl2.y + sz2.height); 
    if (x_tl < x_br && y_tl < y_br) 
    { 
     roi = Rect(x_tl, y_tl, x_br - x_tl, y_br - y_tl); 
     return true; 
    } 
    return false; 
} 

Yes. Có một phương pháp sẵn sàng trong OpenCV cho rằng trong opencv/modules/stitching/src/util.cpp