2012-08-02 36 views
7

Tôi đang cố gọi hàm OpenCV là MinAreaRect2 từ trong python. Tôi sử dụng OpenCV 2.4.2 với python 2.7 và numpy 1.6. Tôi đã đi xa đến đây:Python OpenCV Box2D

import cv 

def nda2ipl(arr, dtype=None): 
    return cv.fromarray(np.ascontiguousarray(arr, dtype=dtype)) 

def min_area_rect2(points): 
    storage = cv.CreateMemStorage() 
    cv_points = nda2ipl(points.reshape((-1, 1, 2))) 
    out = cv.MinAreaRect2(cv_points, storage) 
return out 

Tôi có thể gọi chức năng này với một hình dạng (N x 2). Tôi nhận được loại kết quả này:

((476.5, 604.5), (951.0, 1207.0), -0.0) 

Tôi giả định rằng tuple đầu tiên là trung tâm của hộp, thứ hai cho chiều rộng và chiều cao và góc thứ hai là góc.

Vấn đề là tôi không thể có được tham chiếu rõ ràng nêu rõ điều này. Trên thực tế, tài liệu opencv cho tôi biết các hàm trả về bằng Python.

Tôi đã tìm thấy official documentation about this function nhưng điều này không hữu ích.

Đầu ra chính xác của MinAreaRect2 trong python là gì? Nói chung, bạn nhận được tài liệu chính xác về trình bao bọc python OpenCV ở đâu?

Trả lời

11

OpenCV Python tài liệu wrapper được giữ cùng với các tài liệu bình thường trong cùng một trang web, www.docs.opencv.org

Đầu Python module được sử dụng là cv giao diện, trong đó sử dụng các kiểu dữ liệu có nguồn gốc từ gốc C++ giao diện như CvMat, cvSeq, v.v.

Sau đó, nó được chuyển sang giao diện cv2 tốt hơn, nâng cao và đơn giản hơn. Trong đó, mọi thứ được trả về dưới dạng mảng Numpy hoặc các kiểu dữ liệu python gốc.

Ở đây, bộ trả về có cùng các đối số như là cvBox2D. Bạn có thể tìm thêm chi tiết về sự khác biệt giữa các trình đóng gói python khác nhau tại đây: What is different between all these OpenCV Python interfaces?

Ở đây, giả thiết của bạn là chính xác. Những giá trị đó đã xác định chính xác những gì bạn đã đề cập.

Nếu bạn muốn vẽ trực tiếp xoay, bạn cần 4 đỉnh của hình chữ nhật. Đối với điều đó, bạn cần một hàm không bao giờ được thấy trong tài liệu, tức là cv2.cv.BoxPoints() (nhưng đừng lo, nó sẽ có trong tài liệu khi OpenCV 2.4.3 được phát hành.)

bạn có thể tìm thấy một ví dụ về cách vẽ hình chữ nhật xoay trong bài viết này: Rotated Rectangle

enter image description here

+0

Cảm ơn sự giúp đỡ của bạn! –

+1

Bằng cách nào đó đáng thất vọng, có vẻ như họ đã [hoãn] (http://code.opencv.org/issues/2023) yêu cầu thêm BoxPoints của bạn vào tài liệu, cho đến khi OpenCV 3.0 –

1

Như đã trình bày trong tài liệu mà bạn liên kết, MinAreaRect2 trả về một Box2D object:

Một đối tượng CvBox2D được xác định bởi trung tâm, kích thước và góc của nó, như bạn giả định một cách chính xác, như mô tả here.

Nói chung, tài liệu về trình bao bọc Python khá kém. Đặt cược tốt nhất của bạn là tham khảo tài liệu C++ và đọc mã nguồn.

+1

Cám ơn câu trả lời của bạn. Nhưng hàm python không trả về một đối tượng Box2D mà là một tuple python. Vì vậy, tôi tự hỏi về mối quan hệ giữa các phần tử tuple và cấu trúc C++ Box2D.Tôi đã thử nhìn vào mã nguồn nhưng không thể tìm thấy một nơi có thể cho tôi câu trả lời. Tôi gặp khó khăn trong việc hiểu cách thư viện opencv được gói gọn vào python. Bất kỳ gợi ý nào về điều này sẽ rất được hoan nghênh. –

+0

Tôi thấy bài đăng này khá rõ ràng: http://opencvpython.blogspot.com.es/2012/06/contours-2-brotherhood.html – Antoni