ios – grabCut中的Bad参数(图像必须具有CV_8UC3类型)

我使用以下代码使用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;

将UIImage转换为Mat图像的代码如下所示

- (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,rows),imge.CGImage);
    CGContextRelease(contextRef);
    CGColorSpaceRelease(colorSpace);

    return cvMat;
}

但我得到了错误

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

如果我改变
cv :: Mat cvMat(rows,CV_8UC4); line to cv :: Mat cvMat(rows,CV_8UC3);
然后我得到<错误>:CGBitmapContextCreate:不支持的参数组合:8个整数位/组件; 32位/像素; 3组分色彩空间; kCGImageAlphaNoneskipLast; 342字节/行..

在这里感到很困惑.

请帮忙

解决方法

问题似乎是,你得到的图像有一个alpha通道,而grabcut需要一个没有alpha通道的rgb图像.所以你需要摆脱额外的渠道.

例如,您可以使用此功能执行此操作:

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

这会解决您的问题吗?

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...