>我有一个物体的轮廓和中心坐标。现在我正在尝试检测位于轮廓边界上的点,但仍与中心位于相同的高度 (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
}
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)
另外,您能否在从图像创建原始垫子的地方添加代码?也许,那里有一些问题。