颜色值在整个图像中具有相同的值

时间:2019-06-18 13:22:44

标签: android opencv image-processing mobile kotlin

我有一个物体的轮廓和中心坐标。现在,我试图检测位于轮廓边界上的点,但仍与中心处于相同的高度(y)。背景设置为黑色。因此,我正在计算阈值图像,并在像素上进行迭代,并检查它们是否设置为白色。问题是,根据我的代码,所有值均为0。

也尝试处理原始图像。问题仍然出现,我总是得到0/255/255。不管我是在物体内部还是背景。

private fun calcPointOnContour(point: Point, image: Mat): Point {
    var pointOnContour = Point()
    val ycrcb = getCbComponent(image)
    val imageThresh = getThresholdImage(ycrcb)

    for (i in point.x.toInt() until image.cols()) {
        val pixel = imageThresh.get(i, point.y.toInt())

        if (pixel[0] < 255) {
            pointOnContour = Point(i.toDouble(), point.y)
            break
        }
    }

    return pointOnContour
}

private fun getCbComponent(mat: Mat): Mat {
    val ycrcb = Mat(mat.rows(), mat.cols(), CvType.CV_8UC3)
    val lYCrCb = ArrayList<Mat>(3)

    Imgproc.cvtColor(mat, ycrcb, Imgproc.COLOR_RGB2YCrCb)
    Core.split(mat, lYCrCb)

    return lYCrCb[2]
}

private fun getThresholdImage(mat: Mat): Mat {
    val imageThresh = Mat.zeros(mat.rows(), mat.cols(), CvType.CV_8UC1)
    Imgproc.threshold(mat, imageThresh, 100.0, 255.0, Imgproc.THRESH_BINARY)

    return imageThresh
}

1 个答案:

答案 0 :(得分:0)

Imgproc.threshold是一种根据提供的阈值将图像转换为二进制的方法。 https://docs.opencv.org/2.4/doc/tutorials/imgproc/threshold/threshold.html

您提供的maxVal为255,因此只有0或255。

====

Imgproc.cvtColor(mat, ycrcb, Imgproc.COLOR_RGB2YCrCb)
Core.split(mat, lYCrCb)

我认为应该是Core.split(ycrcb, lYCrCb)

还可以在代码中添加代码以创建原始Mat的位置吗?也许那里有些问题。