Позвольте мне попытаться ответить на этот вопрос навсегда. 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;
}