【问题标题】:Android OpenCV color segmentation display on ImageViewImageView上的Android OpenCV颜色分割显示
【发布时间】:2014-08-25 21:54:46
【问题描述】:

我到处寻找解决方案,但没有找到。我知道这是一个反复出现的问题,所以我会尽量准确。

我想使用 Android 和 OpenCV 在 HSV 中执行颜色分割。我有一个 HSV 样本数组,对应于我要分割的颜色,从中获得 meanstd 以获得一系列值,例如:

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 和 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 H&S channels of the HSVimage
mH = channels.get(0);
mS = channels.get(1);

if(mH!=null & 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);

但是当我显示结果图像时,我得到了一个全黑的图像。我知道这是错误的,因为相机正对着我要分割的彩色对象。

我做错了什么?

【问题讨论】:

    标签: android c++ opencv colors


    【解决方案1】:

    多么愚蠢的错误。我正在从空的tmp Mat 创建位图。

    相反,我需要使用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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-19
      • 2016-09-10
      • 2017-12-15
      • 2016-09-11
      • 1970-01-01
      • 2016-08-05
      • 1970-01-01
      相关资源
      最近更新 更多