Moin,
ich versuche aktuell die OpenCV Komponente für iOS zu verwenden und habe mir auf der Seite in den Dokumentationen die Testprojekte angesehen. Dort wurde folgende Methode verwendet, um ein 'schwarz-weiß Bild' zu erzeugen
Alles anzeigen
Leider führt dies zu folgender Konsolenausgabe:
Im Anschluss noch mal die gesamte datei, damit ihr die Zusammenhänge einsehen könnt. beide anderen test-Methoden laufen durch. nur die cvMatGrayFromUIImage wirft einen Fehler.
Alles anzeigen
Eventuell kann mich jemand darüber aufklären, in wie fern dort falsche Parameter kombiniert werden?
ich versuche aktuell die OpenCV Komponente für iOS zu verwenden und habe mir auf der Seite in den Dokumentationen die Testprojekte angesehen. Dort wurde folgende Methode verwendet, um ein 'schwarz-weiß Bild' zu erzeugen
C-Quellcode
- - (cv::Mat)cvMatGrayFromUIImage:(UIImage *)image
- {
- CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage);
- CGFloat cols = image.size.width;
- CGFloat rows = image.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), image.CGImage);
- CGContextRelease(contextRef);
- CGColorSpaceRelease(colorSpace);
- return cvMat;
- }
Leider führt dies zu folgender Konsolenausgabe:
Shell-Script
- Aug 17 11:14:24 OpenCVDemo[1250] <Error>: CGBitmapContextCreate: unsupported parameter combination: set CGBITMAP_CONTEXT_LOG_ERRORS environmental variable to see the details
- Aug 17 11:14:24 OpenCVDemo[1250] <Error>: CGContextDrawImage: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
C-Quellcode
- //
- // SPOpenCVImageView.m
- // OpenCVDemo
- //
- // Created by Bocksteger, Daniel on 17.08.15.
- // Copyright (c) 2015 Bocksteger, Daniel. All rights reserved.
- //
- #import "SPOpenCVImageView.h"
- #import <opencv2/opencv.hpp>
- @implementation SPOpenCVImageView
- // Only override drawRect: if you perform custom drawing.
- // An empty implementation adversely affects performance during animation.
- - (void)drawRect:(CGRect)rect {
- // Drawing code
- UIImage *wwImage = [UIImage imageNamed:@"ww_logo.jpg"];
- cv::Mat wwMat = [self cvMat3ChannelFromUIImage:wwImage];
- [imageView setImage:[self UIImageFromCVMat:wwMat]];
- }
- #pragma mark - OpenCV
- - (cv::Mat)cvMatFromUIImage:(UIImage *)image
- {
- CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage);
- CGFloat cols = image.size.width;
- CGFloat rows = image.size.height;
- cv::Mat cvMat(rows, cols, CV_8UC4); // 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), image.CGImage);
- CGContextRelease(contextRef);
- return cvMat;
- }
- - (cv::Mat)cvMatGrayFromUIImage:(UIImage *)image
- {
- CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage);
- CGFloat cols = image.size.width;
- CGFloat rows = image.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
- kCGImageAlphaNoneSkipLast |
- kCGBitmapByteOrderDefault); // Bitmap info flags
- CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage);
- CGContextRelease(contextRef);
- CGColorSpaceRelease(colorSpace);
- return cvMat;
- }
- - (cv::Mat)cvMat3ChannelFromUIImage:(UIImage *)image
- {
- CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage);
- CGFloat cols = image.size.width;
- CGFloat rows = image.size.height;
- cv::Mat rgba(rows, cols, CV_8UC4, cvScalar(1,2,3,4)); // 8 bits per component, 4 channels
- CGContextRef contextRef = CGBitmapContextCreate(rgba.data, // Pointer to backing data
- cols, // Width of bitmap
- rows, // Height of bitmap
- 8, // Bits per component
- rgba.step[0], // Bytes per row
- colorSpace, // Colorspace
- kCGImageAlphaNoneSkipLast |
- kCGBitmapByteOrderDefault); // Bitmap info flags
- CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage);
- CGContextRelease(contextRef);
- cv::Mat bgr( rgba.rows, rgba.cols, CV_8UC3 );
- cv::Mat alpha( rgba.rows, rgba.cols, CV_8UC1 );
- cv::Mat out[] = { bgr, alpha };
- // rgba[0] -> bgr[2], rgba[1] -> bgr[1],
- // rgba[2] -> bgr[0], rgba[3] -> alpha[0]
- int from_to[] = { 0,2, 1,1, 2,0, 3,3 };
- mixChannels( &rgba, 1, out, 2, from_to, 4 );
- return bgr;
- }
- -(UIImage *)UIImageFromCVMat:(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;
- }
- @end
Man kann alles schaffen. Man muss es nur wollen
www.regetskcob.github.io
www.regetskcob.github.io