我有一个物体的轮廓和中心坐标。现在,我试图检测位于轮廓边界上的点,但仍与中心处于相同的高度(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
}
答案 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的位置吗?也许那里有些问题。