2013-05-14 22 views
5

Tôi đang sử dụng thuật toán grabCut sử dụng đoạn mã sau:Bad luận (ảnh phải có loại CV_8UC3) trong grabCut

cv::Mat img=[self cvMatFromUIImage:image]; 

cv::Rect rectangle(10,10,300,150); 

cv::Mat result; // segmentation (4 possible values) 
cv::Mat bgModel,fgModel; // the models (internally used) 
// GrabCut segmentation 
cv::grabCut(img, // input image 
      result,  // segmentation result 
      rectangle, // rectangle containing foreground 
      bgModel,fgModel, // models 
      3,   // number of iterations 
      cv::GC_INIT_WITH_RECT); // use rectangle 
// Get the pixels marked as likely foreground 
cv::compare(result,cv::GC_PR_FGD,result,cv::CMP_EQ); 
// Generate output image 
cv::Mat foreground(img.size(),CV_8UC3, 
        cv::Scalar(255,255,255)); 
result=result&1; 
img.copyTo(foreground, result); 
      result); 

image=[self UIImageFromCVMat:foreground]; 
ImgView.image=image; 

Mã để chuyển đổi UIImage-Mat image trông như thế này

- (cv::Mat)cvMatFromUIImage:(UIImage *)imge 
{ 
    CGColorSpaceRef colorSpace = CGImageGetColorSpace(imge.CGImage); 
    CGFloat cols = imge.size.width; 
    CGFloat rows = imge.size.height; 

    cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels 

    CGContextRef contextRef = CGBitmapContextCreate(
             cvMat.data,  // Pointer to data 
             cols,   // Width of bitmap 
             rows,   // Height of bitmap 
             8,    // Bits per component 
             cvMat.step[0], // Bytes per row 
             colorSpace,  // Colorspace 
             kCGImageAlphaNoneSkipLast | 
             kCGBitmapByteOrderDefault); 
               // Bitmap info flags 

    CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), imge.CGImage); 
    CGContextRelease(contextRef); 
    CGColorSpaceRelease(colorSpace); 

    return cvMat; 
} 

Nhưng tôi đã gặp lỗi

OpenCV Error: Bad argument (image must have CV_8UC3 type) in grabCut.

Nếu tôi thay đổi cv::Mat cvMat(rows, cols, CV_8UC4); dòng đến cv::Mat cvMat(rows, cols, CV_8UC3); sau đó tôi nhận được <Error>: CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 32 bits/pixel; 3-component color space; kCGImageAlphaNoneSkipLast; 342 bytes/row..

Tôi đang bối rối ở đây vì phải làm gì.

Bất kỳ sự giúp đỡ xin vui lòng

Trả lời

12

Vấn đề có vẻ là, rằng hình ảnh bạn nhận được có một kênh alpha, trong khi grabcut hy vọng một hình ảnh rgb mà không có một kênh alpha. Vì vậy, bạn cần phải loại bỏ kênh bổ sung.

Bạn có thể làm điều này cho ví dụ với chức năng này:

cv::cvtColor(img , img , CV_RGBA2RGB); 

Điều này giải quyết vấn đề của bạn?

+0

thanx @sietschie, nó hoạt động, giải quyết lỗi. Nhưng tôi vẫn không thể nhận được tất cả các đối tượng tiền cảnh. Ảnh nền vẫn xuất hiện ở nửa màn hình. Và tôi có thể làm cho khu vực hình chữ nhật từ các đường nét? –

+0

Nếu không nhìn thấy hình ảnh của bạn thật khó để đưa ra quyết định. Nhưng tất nhiên nó có thể là có thể, rằng GrabCut không thể phân đoạn các đối tượng của bạn đúng cách. Và tất nhiên nó có thể nhận được hộp giới hạn của một đường bao. Nhưng nếu bạn muốn sử dụng nó làm đầu vào cho GrabCut, tôi sẽ đề nghị chuyển nó thành một mặt nạ thay thế. Bằng cách đó bạn có thể tận dụng nhiều thông tin được cung cấp bởi các đường nét. – sietschie

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