#android #c #opencv #colors
#Android #c #opencv #Цвет
Вопрос:
Я везде искал решение, но так и не нашел ни одного. Я знаю, что это повторяющийся вопрос, поэтому я постараюсь быть точным.
Я хочу выполнить цветовую сегментацию в HSV с использованием Android и OpenCV. У меня есть массив образцов HSV, соответствующих цвету, который я хочу сегментировать, из которого я получаю mean
и std
для получения диапазона значений, таких как:
lowerBoundH = new Scalar(meanSamples[0]-stdSamples[0]);
lowerBoundS = new Scalar(meanSamples[1]-stdSamples[1]);
upperBoundH = new Scalar(meanSamples[0] stdSamples[0]);
upperBoundS = new Scalar(meanSamples[1] stdSamples[1]);
Как только я получу эти диапазоны для H, S и V, я сделаю следующее (я работаю только с каналами H amp; S):
mH = new Mat();
mS = new Mat();
List<Mat> channels = new ArrayList<Mat>(2);
// convert inputFrame to HSV for segmentation
Mat hsvFrame = new Mat();
convertToHSV(inputFrame, hsvFrame);
Core.split(hsvFrame, channels);
// get Hamp;S channels of the HSVimage
mH = channels.get(0);
mS = channels.get(1);
if(mH!=null amp; mS!=null){
mHinRange = new Mat();
mSinRange = new Mat();
Core.inRange(mH, lowerBoundH, upperBoundH, mHinRange);
Core.inRange(mS, lowerBoundS, upperBoundS, mSinRange);
Mat filtered = new Mat(hsvFrame.height(), hsvFrame.width(), CvType.CV_8UC1, new Scalar(4));
Core.bitwise_and(mHinRange, mSinRange, filtered);
Mat aux = new Mat();
Mat mRgb = new Mat();
inputFrame.copyTo(mRgb);
Imgproc.cvtColor(filtered, mRgb, Imgproc.COLOR_GRAY2BGR, 0);
Imgproc.cvtColor(mRgb, aux, Imgproc.COLOR_BGR2RGBA, 0);
return aux;
}else{
Log.v("NULL","H OR S CHANNELS ARE NULL");
return null;
}
Затем я преобразую эту сегментацию Mat
в Bitmap
, чтобы отобразить ее ImageView
вот так:
Bitmap bmp = null;
Mat tmp = new Mat(result.height(),result.width(), CvType.CV_8UC1, new Scalar(4));
try {
bmp = Bitmap.createBitmap(tmp.cols(), tmp.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(tmp, bmp);
}catch (CvException e){Log.d("Exception",e.getMessage());}
qrImage.setImageBitmap(bmp);
Но когда я показываю результирующее изображение, я получаю полностью черное изображение. Я знаю, что это неправильно, потому что камера обращена непосредственно к цветному объекту, который я хочу сегментировать.
Что я делаю не так?
Ответ №1:
Какая глупая ошибка. Я создавал растровое изображение из пустого tmp
листа.
Вместо этого мне нужно создать его с помощью result
Mat:
Bitmap bmp = null;
try {
bmp = Bitmap.createBitmap(result.cols(), result.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(result, bmp);
}catch (CvException e){Log.d("Exception",e.getMessage());}
qrImage.setImageBitmap(bmp);