2016-09-09 5 views
0

ここでは、OpenCVを使用してCVMatからUIImageに変換したコードを示します。このコードではすべて正常に動作し、そこにはクラッシュはありません。しかし色は変わる。iOSのUIImageFromCVMat()でクラッシュするアプリケーション

-(UIImage *)UIImageFromCVMat:(cv::Mat)cvMat 
{ 
    cvtColor(cvMat, cvMat, CV_BGR2RGB); 

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

回避策として、コードからcvtColor()機能をコメントしました。元の色を維持できるようになりましたが、今問題はランダムにクラッシュすることがあります。私はopencv2/imgcodecs/ios.hからUIImageFromCvMat()を使用しようと試みたが、同じ方法でクラッシュする。

クラッシュを防止したい場合は、コード内にcvtColor()を保持する必要がありますが、実際の色が変更されます。私はここで何か間違いはありますか?

enter image description here

EDIT

私はちょうど私が方法にUIImage変換のための特定のれるCvMatを通過するときにこれが起こっていることを見出しました。私は画像処理コードを投稿しているところからMat - > UIImageを呼び出しています。

grayImage(cvMat)を渡してもうまく動作しますが、変換にcroppedImage(cvMat)を渡すとクラッシュします。

-(UIImage*)processImage:(UIImage*)sourceImage{ 

    cv::Mat processMat = [self cvMatFromUIImage:sourceImage]; 




    cv::Mat grayImage; 
    cvtColor(processMat, grayImage, CV_BGR2GRAY); 


    /// Generate grad_x and grad_y 
    cv::Mat grad_x, grad_y; 
    cv::Mat abs_grad_x, abs_grad_y; 

    /// Gradient X 
    //Scharr(src_gray, grad_x, ddepth, 1, 0, scale, delta, BORDER_DEFAULT); 
    cv::Sobel(grayImage, grad_x, CV_16S, 1, 0, 3, 1 , 0); 
    convertScaleAbs(grad_x, abs_grad_x); 

    /// Gradient Y 
    //Scharr(src_gray, grad_y, ddepth, 0, 1, scale, delta, BORDER_DEFAULT); 
    Sobel(grayImage, grad_y, CV_16S, 0, 1, 3, 1, 0); 
    convertScaleAbs(grad_y, abs_grad_y); 

    // Total Gradient (approximate) 
    cv::Mat grad; 
    addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad); 



    std::vector<std::vector<cv::Point> > contours; 
    std::vector<cv::Vec4i> hierarchy; 
    cv::findContours(grad, contours, hierarchy, cv::RETR_CCOMP, cv::CHAIN_APPROX_TC89_KCOS); 

    double maxArea = 0; 
    size_t maxIndex=0; 
    for (size_t i=0; i<contours.size(); ++i) 
    { 
       double area = cv::contourArea(contours[i]); 
       if(area>maxArea){ 
        maxIndex = i; 
        maxArea = area; 
       } 
    } 

    cv::Rect brect = cv::boundingRect(contours[maxIndex]); 
    cv::Mat croppedImage = processMat(brect); 

    //It Works when I pass any other cvMat like grayImage 
    //UIImage *result2 = [self UIImageFromCVMat:grayImage]; // MatToUIImage(grayImage); 

    //This line causes Crash.. 
    UIImage *result = [self UIImageFromCVMat:croppedImage]; // MatToUIImage(grayImage); 




    //Tried to Comment this part 
    croppedImage.release(); 
    grad.release(); 
    grayImage.release(); 
    grad_x.release(); 
    grad_y.release(); 
    processMat.release(); 

    return result; 
} 

enter image description here

+0

クラッシュしたときのエラーは何ですか? – Larme

+0

Imageを追加しました。 – Mrug

答えて

1

BGR2RGB、その後RGB2BGRから変換マット再び、それが動作します。このクラッシュの背後にある理由は分かりませんが、このように努力しています。 cvtColor(cvMat, cvMat, CV_BGR2RGB);の後に行番号cvtColor(cvMat, cvMat, CV_RGB2BGR)を追加します。

+0

ああうわー!!私はこれが単なるトリックだと知っています。しかし、それは働いた..感謝のトン – Mrug

関連する問題