2012-02-27 13 views
7

Tôi đã cố gắng sử dụng triển khai OpenCV của phương thức cắt lấy thông qua các ràng buộc Python. Tôi đã cố gắng sử dụng phiên bản trong cả cv và cv2 nhưng tôi gặp khó khăn trong việc tìm ra các thông số chính xác để sử dụng để có được phương pháp để chạy một cách chính xác. Tôi đã thử một số hoán vị của các tham số và không có gì dường như làm việc (về cơ bản tất cả các ví dụ tôi đã nhìn thấy trên Github). Dưới đây là một vài ví dụ tôi đã cố gắng làm theo:Bindings OpenCV Python cho thuật toán GrabCut

Example 1

Example 2

Và đây là tài liệu của phương pháp và một báo cáo lỗi được biết:

Documentation

Known Grabcut Bug

Tôi có thể lấy mã để thực hiện chúng tôi ing ví dụ bên dưới, nhưng nó trả về một mặt nạ hình ảnh trống (tất cả màu đen).

img = Image("pills.png") 
mask = img.getEmpty(1) 
bgModel = cv.CreateMat(1, 13*5, cv.CV_64FC1) 
fgModel = cv.CreateMat(1, 13*5, cv.CV_64FC1) 
for i in range(0, 13*5): 
    cv.SetReal2D(fgModel, 0, i, 0) 
    cv.SetReal2D(bgModel, 0, i, 0) 

rect = (150,70,170,220) 
tmp1 = np.zeros((1, 13 * 5)) 
tmp2 = np.zeros((1, 13 * 5)) 
cv.GrabCut(img.getBitmap(),mask,rect,tmp1,tmp2,5,cv.GC_INIT_WITH_RECT) 

Tôi đang sử dụng SimpleCV để tải hình ảnh. Loại mặt nạ và loại trả về từ img.getBitmap() là:

iplimage(nChannels=1 width=730 height=530 widthStep=732) 
iplimage(nChannels=3 width=730 height=530 widthStep=2192) 

Nếu ai đó có ví dụ làm việc của mã này, tôi rất muốn xem nó. Đối với những gì nó là giá trị tôi đang chạy trên OSX Snow Leopard, và phiên bản OpenCV của tôi đã được cài đặt từ kho SVN (như của một vài tuần trước). Để tham khảo hình ảnh đầu vào của tôi là: Input Image

Tôi đã thử thay đổi giá trị mặt nạ kết quả enum thành một cái gì đó dễ thấy hơn. Nó không phải là giá trị trả về là vấn đề. Điều này trả về một hình ảnh hoàn toàn màu đen. Tôi sẽ thử thêm một vài giá trị nữa.

img = Image("pills.png") 
mask = img.getEmpty(1) 
bgModel = cv.CreateMat(1, 13*5, cv.CV_64FC1) 
fgModel = cv.CreateMat(1, 13*5, cv.CV_64FC1) 
for i in range(0, 13*5): 
    cv.SetReal2D(fgModel, 0, i, 0) 
    cv.SetReal2D(bgModel, 0, i, 0) 

rect = (150,70,170,220) 
tmp1 = np.zeros((1, 13 * 5)) 
tmp2 = np.zeros((1, 13 * 5)) 
cv.GrabCut(img.getBitmap(), mask, rect, tmp1, tmp2, 5, cv.GC_INIT_WITH_MASK) 
mask[mask == cv.GC_BGD] = 0 
mask[mask == cv.GC_PR_BGD] = 0 
mask[mask == cv.GC_FGD] = 255 
mask[mask == cv.GC_PR_FGD] = 255 
result = Image(mask) 
result.show() 
result.save("result.png") 
+0

Ví dụ đã chuyển đến chuỗi chính. – kscottz

Trả lời

5

Kat, phiên bản này của mã của bạn dường như làm việc cho tôi.

import numpy as np 
import matplotlib.pyplot as plt 
import cv2 


filename = "pills.png" 
im = cv2.imread(filename) 

h,w = im.shape[:2] 

mask = np.zeros((h,w),dtype='uint8') 
rect = (150,70,170,220) 
tmp1 = np.zeros((1, 13 * 5)) 
tmp2 = np.zeros((1, 13 * 5)) 

cv2.grabCut(im,mask,rect,tmp1,tmp2,10,mode=cv2.GC_INIT_WITH_RECT) 

plt.figure() 
plt.imshow(mask) 
plt.colorbar() 
plt.show() 

Tạo hình như thế này, với nhãn 0,2 và 3. enter image description here

1

mặt nạ của bạn được làm đầy với các following values:

  • GC_BGD định nghĩa một pixel nền rõ ràng.
  • GC_FGD xác định pixel rõ ràng trước (đối tượng).
  • GC_PR_BGD xác định pixel nền có thể.
  • GC_PR_FGD xác định pixel nền trước có thể.

nào đều là một phần của một enum:

enum { GC_BGD = 0, // background 
     GC_FGD = 1, // foreground 
     GC_PR_BGD = 2, // most probably background 
     GC_PR_FGD = 3 // most probably foreground 
    }; 

Những dịch để các màu sắc: màu đen hoàn toàn, rất đen, tối đen, và đen. Tôi nghĩ rằng bạn sẽ thấy rằng nếu bạn thêm đoạn mã sau (lấy từ example 1 của bạn và một chút thay đổi) mặt nạ của bạn sẽ trông đẹp hơn:

mask[mask == cv.GC_BGD] = 0 //certain background is black 
mask[mask == cv.GC_PR_BGD] = 63 //possible background is dark grey 
mask[mask == cv.GC_FGD] = 255 //foreground is white 
mask[mask == cv.GC_PR_FGD] = 192 //possible foreground is light grey 
+1

Vì vậy, tôi nhận thấy điều này khi tôi đang cố gắng để có được điều này để làm việc. Tôi chỉ chạy đoạn mã sau: – kscottz

+0

Xem đoạn trích tôi đã thêm ở trên, điều này cũng không hoạt động. Cảm ơn đã giúp đỡ. Nếu bạn có thể đặt ra hình ảnh ví dụ bạn đã sử dụng, tôi sẽ biết ơn. – kscottz

+0

Điều gì xảy ra nếu bạn thử mã trong bình luận của Jan Erik bên dưới? –