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
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? –
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