2012-07-12 33 views
6

Làm thế nào để xác định đường nét trong một đường bao khác? Tôi đã cố gắng để đi qua nhiều hướng dẫn OpenCV nhưng tôi đã không thể xác định nó. Xin vui lòng một số chuyên gia người cung cấp mã đơn giản để giải thích nó?Làm thế nào để xác định đường nét trong một đường bao khác bằng JavaCV?

Đây là tập tin đầu vào của tôi

enter image description here

phần tối Đây là đường viền mà tôi cần phải xác định.

enter image description here

Xin được loại, đủ để chia sẻ kinh nghiệm của bạn với tôi.

+0

bạn có thể cung cấp thêm thông tin? Tiêu chuẩn phát hiện đường viền đầy là gì? – ArtemStorozhuk

Trả lời

2

Đây là một cách tiếp cận đơn giản trong mã Python. (But as I stated in my comment below, It is not an universal answer applicable everywhere, It is just to show finding contour inside a contour can be done. And if your images are different, then you have to come with some different constraints other than i mentioned below)

Những gì bạn đang làm sau khi tìm Contours là, bạn kiểm tra xem khu vực của mỗi đường bao nhỏ hơn giá trị đã chỉ định (tôi đã cho 10000, chỉ đoán), nếu không phải là đường viền lớn hơn, hãy tránh nó. Nếu ít hơn giá trị được chỉ định, nó có thể là hình vuông hoặc hình chữ nhật bên cạnh nó.

Vì vậy, chúng tôi tìm chiều rộng và chiều cao của nó và kiểm tra xem tỷ lệ co gần bằng 1. nếu có, đó là hình vuông của chúng tôi.

import cv2 
import numpy as np 

img = cv2.imread('sofcnt.jpg') 
gray = cv2.imread('sofcnt.jpg',0) 

ret,thresh = cv2.threshold(gray,127,255,1) 

cont,hier = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE) 

for cnt in cont: 
    approx = cv2.approxPolyDP(cnt,0.02*cv2.arcLength(cnt,True),True) 
    if cv2.contourArea(cnt) < 10000: 
     x,y,w,h = cv2.boundingRect(cnt) 
     if w/float(h) < 2: 
      cv2.drawContours(img,[cnt],0,255,-1) 


cv2.imshow('a',img) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

Kết quả:

enter image description here

+1

Tại sao bạn nghĩ rằng tương tự như hình vuông bên trong một số mưu đồ là con số cần thiết? Có lẽ tác giả muốn tìm một nhân vật chứa trung tâm của một số pologon? Cảm ơn. – ArtemStorozhuk

+1

+1 - Vâng, bạn nói đúng, sau đó anh ta cũng phải xác định điều đó.Tôi nghĩ anh ấy muốn xem cách xác định bất kỳ đường bao nào trong một đường bao, vì vậy đây là một loại để làm như vậy. theo cách này, anh ta phải tìm giải pháp khác, và ofcourse nó không phải là một câu trả lời phổ quát, chỉ cho vấn đề cụ thể này. –

+0

Cập nhật anwer. –

3

Không rất thoải mái với JavaCV, vì vậy đây là làm thế nào tôi đã đi về cách giải quyết vấn đề này trong OpenCV và C (thứ cổ xưa):

  1. Tìm tất cả các đường viền trong hình ảnh bằng cách sử dụng cvFindContours()
  2. Chạy hai vòng lặp (con trỏ lặp lại h_next hoặc bất cứ điều gì là có trong JavaCV) trên các đường nét. Đối với mỗi đường bao trong vòng ngoài, khớp với mỗi đường bao được phát hiện dựa trên. . .
  3. Tính toán hộp giới hạn của mỗi đường bao. Đây sẽ là cấu trúc CvRect.
  4. Vượt qua hai CvRects đến một hàm tính diện tích giao nhau (chồng chéo) giữa hai hình chữ nhật.
  5. Nếu khu vực này bằng diện tích nhỏ hơn của hai hình chữ nhật, thì đường bao tương ứng với hình chữ nhật nhỏ hơn được bao quanh hoàn toàn bởi hình chữ nhật lớn hơn.

    Đây là mã để tìm khu vực giao lộ. Nó phải đã trôi nổi trên web ở đâu đó.

    CvRect intersect(CvRect r1, CvRect r2) { CvRect intersection;

    // find overlapping region 
    intersection.x = (r1.x < r2.x) ? r2.x : r1.x; 
    intersection.y = (r1.y < r2.y) ? r2.y : r1.y; 
    intersection.width = (r1.x + r1.width < r2.x + r2.width) ? 
        r1.x + r1.width : r2.x + r2.width; 
    intersection.width -= intersection.x; 
    intersection.height = (r1.y + r1.height < r2.y + r2.height) ? 
        r1.y + r1.height : r2.y + r2.height; 
    intersection.height -= intersection.y;  
    
    // check for non-overlapping regions 
    if ((intersection.width <= 0) || (intersection.height <= 0)) { 
        intersection = cvRect(0, 0, 0, 0); 
    } 
    
    return intersection; 
    

    }

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