2017-11-05 2 views
0
에서 이력서 :: 매트를 만드는 동안

내가 OpenCV의와 가장 간단한 작업을 수행하기 위해 노력하고있어 - 이력서 : 매트 회색이 오류 얻을 수있는 UIImage 변환 :오류가있는 UIImage

CGBitmapContextCreate: invalid data bytes/row: should be at least 12000 
for 8 integer bits/component, 3 components, kCGImageAlphaNoneSkipLast. 

내가 OpenCV의를 사용하고 있습니다를 V 3.2.0 내가 웹에서 발견 한이 샘플 코드 CocoaPods를 통해 유선 :

- (cv::Mat)cvMatGrayFromUIImage:(UIImage *)image 
{ 
CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage); 
CGFloat cols = image.size.width; 
CGFloat rows = image.size.height; 
cv::Mat cvMat(rows, cols, CV_8UC1); // 8 bits per component, 1 channels 

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; 
} 

답변

1

코드 아래에 사용해보십시오

+ (cv::Mat)cvMatGrayFromUIImage:(UIImage *)image 
{ 
    cv::Mat cvMat = [self cvMatFromUIImage:image]; 
    cv::Mat grayMat; 
    if (cvMat.channels() == 1) { 
     grayMat = cvMat; 
    } 
    else { 
     grayMat = cv :: Mat(cvMat.rows,cvMat.cols, CV_8UC1); 
     cv::cvtColor(cvMat, grayMat, cv::COLOR_BGR2GRAY); 
    } 
    return grayMat; 
} 


+ (cv::Mat)cvMatFromUIImage:(UIImage *)image 
{ 
    CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage); 
    CGFloat cols,rows; 
    if (image.imageOrientation == UIImageOrientationLeft 
     || image.imageOrientation == UIImageOrientationRight) { 
     cols = image.size.height; 
     rows = image.size.width; 
    } 
    else{ 
     cols = image.size.width; 
     rows = image.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); 

    CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage); 
    CGContextRelease(contextRef); 


    cv::Mat cvMatTest; 
    cv::transpose(cvMat, cvMatTest); 

    if (image.imageOrientation == UIImageOrientationLeft 
     || image.imageOrientation == UIImageOrientationRight) { 

    } 
    else{ 
     return cvMat; 

    } 
    cvMat.release(); 

    cv::flip(cvMatTest, cvMatTest, 1); 


    return cvMatTest; 
}