Poc*_*chi 6 opencv objective-c ios
我试图在OpenCV中使用人物检测功能:
cv::HOGDescriptor hog;
hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector());
std::vector<cv::Rect> found;
hog.detectMultiScale(noMask, found, 0.2, cv::Size(8,8), cv::Size(16,16), 1.05, 2);
Run Code Online (Sandbox Code Playgroud)
但我得到以下断言:
OpenCV错误:在computeGradient中,断言失败(img.type()== CV_8U || img.type()== CV_8UC3),文件/ Users/robin/Projects/OpenCVForiPhone/opencv/opencv/modules/objdetect/src/hog. cpp,第174行
这是有道理的,因为我传递的是CV_8UC4图像.
所以我猜我应该创造一个具有这种特性的cvmat.现在我有这两种方法.这让我得到灰色或彩色cvmats(CV_8UC1/CV_8UC4)
对于颜色:
-(cv::Mat)CVMat
{
CGColorSpaceRef colorSpace = CGImageGetColorSpace(self.CGImage);
CGFloat cols = self.size.width;
CGFloat rows = self.size.height;
cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels
CGContextRef contextRef = CGBitmapContextCreate(cvMat.data, // Pointer to backing 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;
}
Run Code Online (Sandbox Code Playgroud)
对于灰度:
-(cv::Mat)CVGrayscaleMat
{
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
CGFloat cols = self.size.width;
CGFloat rows = self.size.height;
cv::Mat cvMat = cv::Mat(rows, cols, CV_8UC1); // 8 bits per component, 1 channel
CGContextRef contextRef = CGBitmapContextCreate(cvMat.data, // Pointer to backing data
cols, // Width of bitmap
rows, // Height of bitmap
8, // Bits per component
cvMat.step[0], // Bytes per row
colorSpace, // Colorspace
kCGImageAlphaNone |
kCGBitmapByteOrderDefault); // Bitmap info flags
CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), self.CGImage);
CGContextRelease(contextRef);
CGColorSpaceRelease(colorSpace);
return cvMat;
}
Run Code Online (Sandbox Code Playgroud)
这是我的猜测,使其成为3个频道:
-(cv::Mat)CVMat3Channels
{
//CGColorSpaceRef colorSpace = CGImageGetColorSpace(self.CGImage);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGFloat cols = self.size.width;
CGFloat rows = self.size.height;
cv::Mat cvMat(rows, cols, CV_8UC3); // 8 bits per component, 3 channels
CGContextRef contextRef = CGBitmapContextCreate(cvMat.data, // Pointer to backing 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);
CGColorSpaceRelease(colorSpace);
return cvMat;
}
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
<Error>: CGBitmapContextCreate: invalid data bytes/row: should be
at least 9792 for 8 integer bits/component, 3 components,
kCGImageAlphaNoneSkipLast.
<Error>: CGContextDrawImage: invalid context 0x0
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,创建兼容8UC3的CGBitmapContext的正确方法是什么?(我假设8UC3表示每个像素有8位RGB通道)
谢谢.
PD:图像转换代码来自Robin Summerhill.
小智 6
我使用你的混合方式,但它不起作用:结果是RGB彩色图像,但失去了许多颜色.
所以我有一个非常简单的转换方式,它是成功的
此代码在XCode中:
lastImage = [firstImage CVMat];
cv::cvtColor(lastImage , lastImage , CV_RGBA2RGB);
Run Code Online (Sandbox Code Playgroud)
它会将lastImage转换为RGB颜色,具有CV_8UC3样式.
很抱歉,因为这是我第一次发表评论,而且我不知道如何格式化.
您正在使用 正确创建 3 通道图像CV_8UC3。由于CGBitmapContextCreate需要9792字节/行,这意味着应该有3264列(3 通道像素)。如果我运行以下代码,
int cols = 3264;
int rows = 1960; // assuming a ~1.66 aspect ratio here...
Mat temp(rows, cols, CV_8UC3);
cout << temp.step[0] << endl;
Run Code Online (Sandbox Code Playgroud)
9792它按照 的要求输出CGBitmapContextCreate。你能告诉你cvMat.step[0]代码中返回了什么吗?看起来是正确的,但也许还发生了其他事情。
另外,请注意,如果您从 OpenCV 等函数获取图像数据,OpenCV 本身会以 BGR 格式存储数据。imread因此,如果颜色看起来很奇怪,请注意这一点。
| 归档时间: |
|
| 查看次数: |
5004 次 |
| 最近记录: |