Отображение цветовой сегментации Android OpenCV в ImageView

#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);