Я использую следующий код для преобразования UIImage
в cv::Mat
:Преобразование UIImage в резюме :: Мат и чтение резюме :: Mat из файла дает различные результаты
-(cv::Mat)openCVMat{
// Turn a UIImage into a cv::Mat
// Draw the image into a bitmap context: the Mat's matrix
CGColorSpaceRef colorSpace = CGImageGetColorSpace(self.CGImage);
CGFloat columns = self.size.width;
CGFloat rows = self.size.height;
cv::Mat m(rows, columns, CV_8UC4, cv::Scalar(0,0,0,0)); // (bits, 4 channels (RGBA)
CGContextRef context = CGBitmapContextCreate(m.data,
columns,
rows,
8,
m.step[0],
colorSpace,
kCGImageAlphaNoneSkipLast|kCGBitmapByteOrderDefault);
// Draw
CGContextDrawImage(context, CGRectMake(0, 0, columns, rows), self.CGImage);
// Cleanup
CGColorSpaceRelease(colorSpace);
CGContextRelease(context);
// Return
return m;
}
Это похоже на работу хорошо, но на некоторых изображениях в результате cv::Mat
отличается, если я только что прочитал его из файла с imread
:
NSURL *url = [[NSBundle mainBundle] URLForResource:@"blue"
withExtension:@"png"];
cv::Mat fromFile = cv::imread([url.path cStringUsingEncoding:NSUTF8StringEncoding], CV_LOAD_IMAGE_UNCHANGED | CV_LOAD_IMAGE_COLOR);
cv::Mat withAlpha;
cv::cvtColor(fromFile, withAlpha, CV_BGRA2RGBA);
в этом случае, в результате cv::Mat
(withAlpha) немного отличается, особенно в углу им возрастов.
Например, при чтении изображения в качестве UIImage
и затем преобразование в cv::Mat
, конечный пиксель: [0,0,110,255] это RGBA
в то время как последний пиксель после прочтения его непосредственно imread является: [0,0,255, 110] также RGBA
Чтобы все было лучше, этого не происходит со всеми изображениями.
Любые идеи, почему это происходит?
Вот тестовое изображение: blue.png
Nope, такой же результат. :-P – cfischer
Как вы получаете значения пикселей? Вы используете Vec4b? – metsburg