2013-08-28 3 views
0

Я использую следующий код для преобразования 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

ответ

0

Там какое-то несоответствие между форматом считывание и форматом, с которым резюме :: Mat создается.

Я вижу, что при загрузке изображения из пакета ресурсов, вы используете:

  CV_LOAD_IMAGE_UNCHANGED | CV_LOAD_IMAGE_COLOR. 

Просто продолжайте CV_LOAD_IMAGE_UNCHANGED и проверить. Это должно гарантировать загрузку альфа-канала из вашего PNG. Посмотрите, поможет ли это.

+0

Nope, такой же результат. :-P – cfischer

+0

Как вы получаете значения пикселей? Вы используете Vec4b? – metsburg

Смежные вопросы