2013-04-14 36 views
6

Tôi đang cố gắng tách các đường viền của hình ảnh (để tìm các vùng đồng nhất) vì vậy tôi đã áp dụng cvCanny và sau đó cvFindContours, sau đó tôi sử dụng mã sau để vẽ 1 đường bao mỗi lần tôi nhấn một phím:Làm thế nào để có được đường nét riêng biệt (và điền chúng) trong OpenCV?

for(; contours2 != 0; contours2 = contours2->h_next){ 
     cvSet(img6, cvScalar(0,0,0)); 
     CvScalar color = CV_RGB(rand()&255, rand()&255, rand()&255); 
     cvDrawContours(img6, contours2, color, cvScalarAll(255), 100); 
     //cvFillConvexPoly(img6,(CvPoint *)contours2,sizeof (contours2),color); 
     area=cvContourArea(contours2); 
     cvShowImage("3",img6); 
     printf(" %d", area); 
     cvWaitKey(); 
    } 

Nhưng trong lần lặp đầu tiên nó vẽ TẤT CẢ các đường bao, trong giây nó vẽ TẤT CẢ nhưng một, thứ ba rút ra tất cả trừ hai, v.v.

Và nếu tôi sử dụng chức năng cvFillConvexPoly nó lấp đầy hầu hết các màn hình (mặc dù như tôi đã viết này, tôi nhận ra một đa giác lồi sẽ không làm việc cho tôi, tôi cần phải điền chỉ là insideof đường viền)

Vì vậy, , làm cách nào tôi có thể lấy 1 đường viền trên mỗi lần lặp của, thay vì tất cả các đường bao còn lại?

Cảm ơn.

Trả lời

12

Bạn cần thay đổi thông số cuối cùng bạn đang chuyển sang hàm, hiện tại là 100, thành 0 hoặc giá trị âm, tùy thuộc vào việc bạn muốn vẽ trẻ em hay không.

Theo tài liệu (http://opencv.willowgarage.com/documentation/drawing_functions.html#drawcontours), hàm có chữ ký sau đây:

void cvDrawContours(CvArr *img, CvSeq* contour, CvScalar external_color, 
CvScalar hole_color, int max_level, int thickness=1, int lineType=8) 

Từ các tài liệu tương tự, max_level có mục đích sau đây (phần áp dụng nhất được in đậm):

max_level - Mức tối đa cho các đường bao được vẽ. Nếu 0, chỉ đường bao là được vẽ. Nếu 1, đường bao và tất cả các đường viền theo sau trên cùng một cấp độ sẽ được vẽ. Nếu 2, tất cả các đường bao theo sau và tất cả các đường bao, một mức bên dưới các đường bao được vẽ, v.v. Nếu giá trị là tiêu cực, chức năng không vẽ những đường nét sau đây sau khi đường viền rút nhưng những đường nét con đường viền đến $ | \ texttt {mức max_} | -1 $ cấp.

Edit:

Để lấp đầy những đường viền, sử dụng một giá trị âm cho tham số thickness:

dày - Độ dày của dây chuyền những đường nét được vẽ bằng. Nếu nó là âm (Ví dụ: = CV_FILLED), nội dung đường bao sẽ được vẽ.

+0

Cảm ơn rất nhiều, có nghĩa là, tôi đã không nhận thấy thông số đó. Bây giờ tôi chỉ cần điền vào chúng, có chức năng nào không? Nếu không, làm thế nào tôi có thể đi về nó? có thể lưu vực sẽ làm việc cho những người đóng cửa, nhưng đôi khi cũng có những đường nét mở. –

+1

Sử dụng giá trị âm cho tham số độ dày. Nếu điều đó không hiệu quả với bạn, có thể một trong số đó sẽ giúp: http://stackoverflow.com/questions/12929197/opencv-closing-a-shape-and-filling-it, http://stackoverflow.com/ Câu hỏi/1716274/fill-the-holes-in-opencv – maditya

+0

Cảm ơn một lần nữa, Sử dụng một độ dày tiêu cực làm các trick hoàn hảo. –

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