2011-12-14 12 views
7

Tôi có hai đường nét và tôi muốn kiểm tra mối quan hệ giữa chúng (nếu một trong số chúng được lồng nhau). Thông thường, tôi sẽ sử dụng chức năng findContours với chế độ truy xuất CV_RETR_TREE. Tuy nhiên, tôi thu được các đường nét từ một nguồn khác nhau (sử dụng phương thức MSER). Tôi thực sự không chỉ có các đường nét, mà còn là mặt nạ khu vực nếu điều đó giúp. Ví dụ, cho phép nói rằng tôi muốn phân đoạn chữ 'O', sau đó tôi sẽ có mặt nạ hoặc đường nét sau:Cách kiểm tra xem một đường bao được lồng vào/nhúng trong opencv

1)

0 0 0 0 0 0 
0 1 1 1 1 0 
0 1 0 0 1 0 
0 1 0 0 1 0 
0 1 1 1 1 0 
0 0 0 0 0 0 

2)

0 0 0 0 0 0 
0 0 0 0 0 0 
0 0 1 1 0 0 
0 0 1 1 0 0 
0 0 0 0 0 0 
0 0 0 0 0 0 

Làm thế nào tôi có thể dễ dàng kiểm tra xem hộp thứ hai nằm trong đường bao đầu tiên? Tôi nghĩ về việc kiểm tra mối quan hệ giữa các hộp giới hạn, nhưng điều này không bao gồm tất cả các trường hợp có thể xảy ra.

Trả lời

6

Sử dụng cv::pointPolygonTest(InputArray contour, Point2f pt, bool measureDist) để biết liệu điểm từ đường bao nằm bên trong đường khác hay không.

Bạn phải kiểm tra đối với trường hợp biên giới (điểm đầu tiên bạn chọn là chung cho cả đa giác, vv)

if(pointPolygonTest(contour, pointFromOtherContour, false) > 0) 
{ 
    // it is inside 
} 

Chức năng xác định xem điểm nằm bên trong một đường viền, bên ngoài, hoặc nằm trên một cạnh (hoặc trùng với một đỉnh). Nó trả về giá trị dương (bên trong), âm (bên ngoài) hoặc số không (trên một cạnh), tương ứng.

Khi measureDist=false, giá trị trả lại là +1, -1 và 0 tương ứng. Nếu không, giá trị trả lại là khoảng cách đã ký giữa điểm và đường viền gần nhất.

1

Nếu bạn biết rằng các đường bao được đóng (theo ý nghĩa 4 kết nối), thì bạn có thể sử dụng phép thử ray-to-vô cực, thường được sử dụng để kiểm tra xem các điểm có nằm trong các đa giác đã đóng hay không. (Ngoài ra giả sử các đường nét không vượt qua, mà có lẽ họ không thể.)

Lấy bất kỳ điểm nào trên đường viền ứng viên và tiến hành từ đó đến 'vô cùng' theo bất kỳ hướng nào (chọn một trục thẳng hàng, cho dễ triển khai): nếu bạn di chuyển đến cạnh hình ảnh của mình và băng qua đường viền ngoài số lẻ thì đường bao mà bạn bắt đầu nằm bên trong đường bao đó.

'qua' đường viền bên ngoài thực sự là một chút khó khăn, ví dụ:

. 1 1 1 1 1 1 1 
    . 1 . . X X X 1 
    . 1 . . X . X 1 
<-.-1-1-.-X X X 1 : here a naiive implementation counts two crossings 
    . . 1 1 1 1 1 1 

Vì vậy, để kiểm tra xem một ray là 'qua' một đường viền tại một điểm bạn thực sự cần phải xem xét những điểm 3x3 láng giềng. Tôi nghĩ rằng bạn sẽ kết thúc với một tập hợp các trường hợp giống như thế này:

. . . 
<-1-1 1 // not crossing 
    . . . 

    1 . 1 
<-1-1 1 // not crossing 
    . . . 

    . . 1 
<-1-1 1 // crossing 
    . . . 

    1 . . 
<-1-1 1 // crossing 
    . . . 

Tôi không chắc chắn 100% rằng nó có thể để xây dựng một bài kiểm tra phù hợp cho cửa một đường viền 4-kết nối dựa trên 3x3 khu vực lân cận, nhưng có vẻ như nó là như vậy.

Tất cả điều này phụ thuộc vào đường bao bên ngoài đang bị đóng, tất nhiên.