gpt4 book ai didi

c++ - iOS OpenCV cvtColor 未知数组类型错误

转载 作者:太空宇宙 更新时间:2023-11-03 22:05:03 25 4
gpt4 key购买 nike

我开始在 iOS 上使用 OpenCV,我想要实现的第一件事是将彩色图像转换为灰色图像。

我的第一次尝试成功了

我正在获取带有“CV_8UC1”选项的垫子,然后将其转换回图像。

代码如下:

UIImage *image = [UIImage imageNamed:kImageName];

image = [UIImage greyedImage:image];

[imageView setImage:image];

+ (UIImage*)greyedImage:(UIImage*)image
{
return [UIImage imageFromMat:[image toGrayMat]];
}


+ (UIImage*)imageFromMat:(cv::Mat)cvMat
{
NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize()*cvMat.total()];
CGColorSpaceRef colorSpace;

if (cvMat.elemSize() == 1) {
colorSpace = CGColorSpaceCreateDeviceGray();
} else {
colorSpace = CGColorSpaceCreateDeviceRGB();
}

CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);

// Creating CGImage from cv::Mat
CGImageRef imageRef = CGImageCreate(cvMat.cols, //width
cvMat.rows, //height
8, //bits per component
8 * cvMat.elemSize(), //bits per pixel
cvMat.step[0], //bytesPerRow
colorSpace, //colorspace
kCGImageAlphaNone|kCGBitmapByteOrderDefault,// bitmap info
provider, //CGDataProviderRef
NULL, //decode
false, //should interpolate
kCGRenderingIntentDefault //intent
);


// Getting UIImage from CGImage
UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpace);

return finalImage;

}

- (cv::Mat)toGrayMat
{
cv::Mat tmp = [self toMatWithChannelOption:CV_8UC1];

//cvCvtColor(&tmp, &tmp, CV_BGR2GRAY);

return tmp;
}

- (cv::Mat)toMatWithChannelOption:(int)channelOption
{
CGColorSpaceRef colorSpace = CGImageGetColorSpace(self.CGImage);
CGFloat cols = self.size.width;
CGFloat rows = self.size.height;

cv::Mat cvMat(rows, cols, channelOption); // 8 bits per component, 4 channels (color channels + alpha)

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), self.CGImage);
CGContextRelease(contextRef);

return cvMat;

}

但它导致了这个错误

“CGBitmapContextCreate:不支持的参数组合:8 个整数位/分量;32 位/像素;3 分量颜色空间;kCGImageAlphaNoneSkipLast;610 字节/行。5 月 18 日 15:32:23 MacBook-Air.local 测试 [12677]:CGContextDrawImage:无效上下文 0x0。这是一个严重的错误。此应用程序或其使用的库正在使用无效的上下文,从而导致系统稳定性和可靠性的整体下降。此通知是礼貌的:请解决此问题。它将成为即将到来的更新中的 fatal error 。”

之后我尝试像这样使用 cvtColor:

- (cv::Mat)toGrayMat
{
cv::Mat tmp = [self toMatWithChannelOption:CV_8UC4];

cvCvtColor(&tmp, &tmp, CV_BGRA2GRAY);

return tmp;
}

但我知道

“函数 cvarrToMat 中的未知数组类型”。它以某种方式告诉我传递给 cvtColor 的参数不正确。

请指出可能是什么原因。

附注我在很多问题中观察到其他人将该函数称为“cvtColor”,而我只能将其写为 cvCvtColor,否则 Xcode 会更正它并强制我在 mat 函数属性之前放置“&”。

我的导入:“opencv2/imgproc/imgproc_c.h”iOS:8+

最佳答案

使用 cvCvtColorCV_BGRA2GRAY 作为参数将彩色图像转换为灰度图像。每一个都是不同类型的 Mat。彩色图像有 4 个 channel (例如 CV_8UC4),灰度图像有一个 channel (例如 CV_8UC1)。因此,为输入和输出声明单独的参数。以下示例。

#include "opencv2/opencv.hpp"
cv::Mat gray;
cv::Mat tmp = [self toMatWithChannelOption:CV_8UC4];
cv::cvtColor( tmp, gray, CV_BGRA2GRAY );

注意 a) 避免使用 cvCvtColor,因为它是已弃用的 C API ( 1) 的一部分。而是使用 cvtColor。 b) 避免使用 header imgproc_c.h。仅出于兼容性原因提供它。而是使用 imgproc.hpp 或简单地使用 opencv.hpp

关于c++ - iOS OpenCV cvtColor 未知数组类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30303584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com