ios - grabCut 中的错误参数(图像必须具有 CV_8UC3 类型)

标签 ios opencv

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

要转换的代码UIImageMat image看起来像这样

- (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;
}

但是我得到了错误

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

如果我改变 cv::Mat cvMat(rows, cols, CV_8UC4);线到 cv::Mat cvMat(rows, cols, CV_8UC3); 然后我得到<Error>: CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 32 bits/pixel; 3-component color space; kCGImageAlphaNoneSkipLast; 342 bytes/row. .

我在这里很困惑,不知道该怎么做。

请帮忙

最佳答案

问题似乎是,您获得的图像具有 alpha channel ,而 grabcut 需要没有 alpha channel 的 rgb 图像。所以你需要去掉额外的 channel 。

例如,您可以使用此函数执行此操作:

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

关于ios - grabCut 中的错误参数(图像必须具有 CV_8UC3 类型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16537415/

相关文章:

iphone - 在YouTube上上传视频

ios - UISegmentController 与 UITableviewController

c++ - 无法执行 approxPolyDP()

ios - 重新注册时如何更改pjsip注册账号?

ios - 缺少 "master"按钮和滑动手势不起作用 master/detail ios

iphone - 如何在 iPhone 上实现炫酷的警报/信息叠加?

python - 当相机之间的角度过高时,OpenCV 立体图像校正无法正常工作

python - 在python中有效地将颜色转换为透明度

python - 导入 cv2 : importError: dlopen. .. 原因:找不到图像

opencv - 在 JavaCV 或 OPENCV 中查找轮廓