Почему происходит сбой моего приложения при попытке инвертировать UIImage в openCV? - PullRequest
0 голосов
/ 09 ноября 2018

Я уже давно играю с этим, и по какой-то причине не могу запустить следующий код.

+(UIImage *)processInvertedImage:(UIImage *)image {

    cv::Mat mat;
    UIImageToMat(image, mat);   ///this is CV_8U from iPhone camera

    cv::Mat output;
    mat.convertTo(output, CV_32F);   ///cv::invert() requires CV_32F!! (apparently)

    cv::Mat invert;
    cv::invert(output, invert);     /// app crashes here, error message below

    cv::Mat gray;
    cv::cvtColor(invert, gray, CV_RGB2GRAY);  

    UIImage *binImg = MatToUIImage(gray);

    return binImg;

}

Я получаю следующий код ошибки:

libc ++ abi.dylib: завершается с необработанным исключением типа cv :: Exception: OpenCV (3.4.2) / Volumes / build-storage / build / 3_4_iOS-mac / opencv / modules / core / src / lapack. cpp: 839: ошибка: (-215: подтверждение не выполнено) type == 5 || введите == 6 в функции 'инвертировать'

что означает этот тип == 5 || тип == 6 значит?

1 Ответ

0 голосов
/ 09 ноября 2018

Позвольте мне попытаться ответить на этот вопрос навсегда. type == 5 || type == 6 означает, что вам нужно работать с CV_32F или CV_64F. Однако UIImage обычно имеет 4 канала. Бьюсь об заклад, ваш UIImageToMat дает мат типа CV_8UC3. Так что mat имеет тип CV_8UC3, а output, скорее всего, будет иметь тип CV_32FC3, а не просто CV_32F. И снова, когда вы используете cv::invert(), вы смотрите на математическое обратное , то есть output * mat = identity_matrix.

+(UIImage *)processInvertedImage:(UIImage *)image {

    cv::Mat mat;
    UIImageToMat(image, mat);   ///this is CV_8U from iPhone camera

    if (mat.type() == CV_8UC3) {
        NSLog(@"mat type is CV_8UC3"); // mostlikely this
    } else if (mat.type() == CV_8UC4){
        NSLog(@"mat type is CV_8UC4");
    }

    cv::Mat output;
    mat.convertTo(output, CV_32F);   ///cv::invert() requires CV_32F!! (apparently)
    if (output.type() == CV_32FC3){
        NSLog(@"output type is CV_32FC3"); // most likely this 
    }

    // this is really bad naming, since you seem to use namespace cv somewhere, 
    // as CV_32F doesn't have cv:: prefix
    cv::Mat invert;                
    cv::invert(output, invert);     /// app crashes here, error message below

    cv::Mat gray;
    cv::cvtColor(invert, gray, CV_RGB2GRAY);  

    UIImage *binImg = MatToUIImage(gray);

    return binImg;

}

Редактировать: Если вам нужна обработка изображения в обратном порядке, тогда вы можете сделать что-то похожее на то, что вы имели в последнем вопросе:

+(UIImage *)processInvertedImage:(UIImage *)image {
    cv::Mat mat;
    UIImageToMat(image, mat);

    // convert to RGB
    cv::Mat rgb
    cv::cvtColor(mat, rgb, COLOR_RGBA2RGB);

    // create mat of same size and type with values 255
    cv::Mat dummy(rgb.size(), rgb.type(), cv::Scalar(255,255,255));

    // three channels
    cv::Mat rgb_invert = dummy ^ rgb;

    cv::Mat gray;
    cv::cvtColor(rgb, gray, COLOR_RGB2GRAY);

    cv::Mat gray_invert = 255 ^ gray;

    // depending what invert you would like
    UIImage* binImg = MatToUIImage(rgb_invert);

    return binImg;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...