这是我参与更文应战的第 4 天,活动概况查看: 更文应战

规范霍夫转化的原理就是把图画空间转化成参数空间(即霍夫空间),例如霍夫转化的直线检测就是在间隔 -视点空间内进行数组排序检测。圆能够标明为:

(x−a)2+(y−b)2=r2(x-a)^2+(y-b)^2 = r^2

其间ab代表圆心坐标,r代表圆半径。因此,霍夫转化的圆检测就是在这三个参数组成的三维空间内进行。原则上,霍夫转化能够检测任何形状。但凌乱的形状需求的参数很多,霍夫空间的github是干什么的维数对应就多,因此在程序完结上所需的内存空间以scala和java的差异及运转功率上都不利于把规范霍夫转化应用于实践凌乱图形的检测中。 所以一些改进的霍夫转化就相继提出,它们的基本原理就是尽可能减小霍夫空间的维数

霍夫圆检测

霍夫圆检测分为两个阶段:

  • 检测圆心
  • 从圆心推导出圆半径

检测圆心

检测圆心的原理是圆心是它地址圆周悉数法线的交点。因此只需找到法线的交点,即可供认圆心。具体进程如下:

  • 边缘检测;
  • 核算图画梯度,并供认圆周线。圆周线的梯度即为法线;
  • 在二维霍夫空间内,绘制悉数图形的梯度直线,某坐标点上累加和的值越大,说明在该点上直线相交的次数越多,也就APP越可能是圆心;
  • approve霍夫空间内,4领域内进行非最大值克制;
  • 设定阈值,霍夫空间内累加和大于该阈值的点就对应于圆心。

从圆心推导出圆半径

  • 核算某一个圆心到悉数Scala圆周线的间隔;
  • 设定两个阈值,界说为最大半径和最gitee小半径,保存间隔在这两个半径之间的值,这意味着我们检测的圆不能太大,也不能太小;
  • 对保存下来的间隔进行排序;
  • 找到间隔相同的那些值,并核算相同值的数量;
  • 设定一个阈值,只要相同值的数量大于该阈值,才以为该值是该圆心对应的圆半径;
  • 对每一个圆心,完结以上进程,得到悉数的圆半径。

API

public static void HoughCircles(Mat image, Mat circles, int mgitiethod, double dp, double minDist,github是干什么的 double param1, double param2, int minRadius, iscalarnt maxRadius)
  • 参数一:image,待检测圆源码共享网形的图画,有必要是CV_8UC1的灰度图

  • 参数二:circles,检测作用。每个圆形用3个参数标明,即(x , y , radius),圆心坐标和圆半径

  • 参数三:数组method,检测圆形的scala面试题办法标志,虽然有4个可选项,但是现在只完结了HOUGH_GRADIENT

    // Cgithub是干什么的++: enum HoughModes
    pugit教程blic static final int
    HOUGH_STANDARD = 0,
    HOUGH_PROBABscalabilityILISTIC = 1,
    HOUGH_MULTI_SCALE = 2,
    HOUGH_GRADIENT = 3;
    
  • 参数四:dp,累加器分辨率与图画分辨率的反比。例如,假定 dp = 1,则累加器具有与输入scalability图画相同的分辨率。假定dp = 2,数组去重则累加器的宽度和高application度为输入图画一半

  • 参数五:minDist,检测作用中两个圆心之间的最小间隔。假定参数太小,则除了实在的圆圈外,还可能会差错地检测到多个邻居圆圈。 假定太大,可能会失去一些圆圈。

  • 参数六:param1,运用HOUGH_GRADIENT检测圆形时,它是传递给Canny边缘检测器的两个阈值中的较大值(较小值为较大值的一半)。

  • 参数七:param2,运用HOUGH_GRADIENT检测圆形时,此参数为检测圆形的累加scalar器阈值,阈值越大,则检测的圆形越精准。

  • 参数八:minRadius,检测圆的最小半径。

  • 参数九:minRadius,检测圆的最大application半径。

操作

/**
* 霍夫圆检测
* author: yidong
* 2020/9/2
*/
class HoughCircleDetectActivity : AppCompatActivity()源码交易网站源码 {
private lateinit var mBinding: ActivityHoughCircleBinding
priva数组c言语te lateinit var mGray: Mat
private lateinit var mRgb: Mat
override fun onCreate(savedInstanceSapprovetat源码年代e: Bundl源码编辑器手机版下载e?) {
super.onCreaapplicationte(savedInstanceState)
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_hough_cir数组初始化cle)
mBindinapplicationg.presenter = this
mGray = Mat()
m源码交易网站源码Rgb = Mat()
val source = Utils.loa源码编辑器dResourc源码年代e(this, R.drawable.coins)
Imgproc.数组去重办法cvtColor(source, mGray, Imgproc.COLOR_appstoreBGR2GRAY)
Imgproc.cvtColor(source, mRgb, Imgproc.COLOR_BGR2RGB)
mBinding.ivLena.showMat(mRgb)
source.release()
}
fugiti轮胎n doHoughCircleDetect()scala怎么读 {
val circle = Mat()
Imgproc.GaussianBlur(mGray, mGray, Size(9.0, 9.0), 2.0, 2.0)
Imgproc.HoughCircles(源码共享网
mGray,
circle,
Imgproc.HOUGH_GRADIENT,
2.0,
240.0,
100.0,
100.0,
100,
200
)
for (inAPPdex iscala教程n 0 until circle.cols()) {
val content = FloatArray(3)
circle.get(0, index, content)
val center =
Point(content[0].roundToInt().toDouble(), content[1].roundToInt().toDouble())
val radius = content[2].roundToInt()
Imgproc.circle(mRgb, center, 3, Scalar(0.0, 255.0, 0.0), -1, 8, 0)
Imgpr源码之家oc.circle(mRgb, center, radius, Scalar(0.0, 0.0, 255.0), 3, 8, 0)
mBinding.ivResult.showMat(mRgb)
}
}
override fun onDestroy() {
mGray.rgitlabelease()
mRgb.releaseGit()
super.onDestroy()
}
}

作用

Android OpenCV(三十三):霍夫圆检测

源码

github.com/onlyloveyd/…