欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android基于OpenCV實(shí)現(xiàn)Harris角點(diǎn)檢測(cè)

 更新時(shí)間:2021年06月23日 09:53:21   作者:易冬  
角點(diǎn)就是極值點(diǎn),即在某方面屬性特別突出的點(diǎn)。當(dāng)然,你可以自己定義角點(diǎn)的屬性(設(shè)置特定熵值進(jìn)行角點(diǎn)檢測(cè))。角點(diǎn)可以是兩條線的交叉處,也可以是位于相鄰的兩個(gè)主要方向不同的事物上的點(diǎn)。本文介紹如何基于OpenCV實(shí)現(xiàn)Harris角點(diǎn)檢測(cè)

什么是角點(diǎn)?

角點(diǎn)就是極值點(diǎn),即在某方面屬性特別突出的點(diǎn)。當(dāng)然,你可以自己定義角點(diǎn)的屬性(設(shè)置特定熵值進(jìn)行角點(diǎn)檢測(cè))。角點(diǎn)可以是兩條線的交叉處,也可以是位于相鄰的兩個(gè)主要方向不同的事物上的點(diǎn)。角點(diǎn)通常被定義為兩條邊的交點(diǎn),或者說(shuō),角點(diǎn)的局部鄰域應(yīng)該具有兩個(gè)不同區(qū)域的不同方向的邊界。常見(jiàn)的角點(diǎn)有:

  • 灰度梯度的最大值對(duì)應(yīng)的像素點(diǎn);
  • 兩條直線或者曲線的交點(diǎn);
  • 一階梯度的導(dǎo)數(shù)最大值和梯度方向變化率最大的像素點(diǎn);
  • 一階導(dǎo)數(shù)最大,二階導(dǎo)數(shù)為零的像素點(diǎn)(指示物體邊緣變化不連續(xù)的方向)。

為什么要檢測(cè)角點(diǎn)?

角點(diǎn)是圖像很重要的特征,對(duì)圖像圖形的理解和分析有很重要的作用。角點(diǎn)在保留圖像圖形重要特征的同時(shí),可以有效地減少信息的數(shù)據(jù)量,使其信息的含量很高,有效地提高了計(jì)算的速度,有利于圖像的可靠匹配,使得實(shí)時(shí)處理成為可能。角點(diǎn)在三維場(chǎng)景重建、運(yùn)動(dòng)估計(jì)、目標(biāo)跟蹤、目標(biāo)識(shí)別、圖像配準(zhǔn)與匹配等計(jì)算機(jī)視覺(jué)領(lǐng)域起著非常重要的作用。

Harris角點(diǎn)檢測(cè)

人眼對(duì)角點(diǎn)的識(shí)別通常是在一個(gè)局部的小區(qū)域或小窗口完成的。如果在各個(gè)方向上移動(dòng)這個(gè)特征的小窗口,窗口內(nèi)區(qū)域的灰度發(fā)生了較大的變化,那么就認(rèn)為在窗口內(nèi)遇到了角點(diǎn)。如果這個(gè)特定的窗口在圖像各個(gè)方向上移動(dòng)時(shí),窗口內(nèi)圖像的灰度沒(méi)有發(fā)生變化,那么窗口內(nèi)就不存在角點(diǎn);如果窗口在某一個(gè)方向移動(dòng)時(shí),窗口內(nèi)圖像的灰度發(fā)生了較大的變化,而在另一些方向上沒(méi)有發(fā)生變化,那么,窗口內(nèi)的圖像可能就是一條直線的線段。

Harris角點(diǎn)檢測(cè)原理用公式演算如下:

其中w(x,y)表示滑動(dòng)窗口權(quán)重函數(shù),可以是常數(shù)也可以是高斯函數(shù)。E(u,v)表示滑動(dòng)窗口向各個(gè)方向移動(dòng)時(shí)像素值衡量系數(shù)的變化。

這里λ1,λ2是矩陣M的2個(gè)特征值,k是一個(gè)指定值,這是一個(gè)經(jīng)驗(yàn)參數(shù),需要實(shí)驗(yàn)確定它的合適大小,通常它的值在0.04和0.06之間,它的存在只是調(diào)節(jié)函數(shù)的形狀而已。R取決于M的特征值,對(duì)于角點(diǎn)|R|很大,平坦的區(qū)域|R|很小,邊緣的R為負(fù)值;

API

public static void cornerHarris(Mat src, Mat dst, int blockSize, int ksize, double k, int borderType) 
  • 參數(shù)一:src,輸入源圖像。必須是單通道8U或者32F類(lèi)型。
  • 參數(shù)二:dst,輸出評(píng)價(jià)系數(shù)R的矩陣。尺寸與src相同,類(lèi)型為單通道32F。
  • 參數(shù)三:blockSize,鄰域大小。
  • 參數(shù)四:ksize,Sobel算子的半徑。
  • 參數(shù)五:k,計(jì)算Harris評(píng)價(jià)系數(shù)R的權(quán)重系統(tǒng)。
  • 參數(shù)六:borderType,像素外推算法標(biāo)志位。

方法的輸出dst為評(píng)價(jià)系數(shù)R的矩陣,由于評(píng)價(jià)系數(shù)有正有負(fù)且范圍較廣,計(jì)算結(jié)束后通常需要進(jìn)行歸一化處理。然后通過(guò)經(jīng)驗(yàn)閾值比較判斷像素點(diǎn)是否為Harris角點(diǎn)。閾值越大,提取的Harris角點(diǎn)越少,閾值越小,提取的Harris角點(diǎn)越多。

操作

/**
 * Harris角點(diǎn)檢測(cè)
 * author: yidong
 * 2020/12/30
 */
class HarrisActivity : AppCompatActivity() {
    private val mBinding: ActivityHarrisBinding by lazy {
        ActivityHarrisBinding.inflate(layoutInflater)
    }

    private val gray by lazy {
        this.getBgrFromResId(R.drawable.lena).toGray()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(mBinding.root)

        mBinding.ivLena.showMat(gray)
        wrapCoroutine({ showLoading() }, { doCornerHarris() }, { hideLoading() })
    }

    private fun doCornerHarris() {
        val dst = Mat()
        val dstNorm = Mat()
        val dstNormal8U = Mat()
        Imgproc.cornerHarris(gray, dst, 2, 3, 0.04)
        Core.normalize(dst, dstNorm, 0.0, 255.0, Core.NORM_MINMAX)
        Core.convertScaleAbs(dstNorm, dstNormal8U)
        Imgproc.threshold(dstNormal8U, dstNormal8U, 120.0, 255.0, Imgproc.THRESH_BINARY)
        GlobalScope.launch(Dispatchers.Main) {
            mBinding.ivResult.showMat(dstNormal8U)
        }
    }

    private fun showLoading() {
        mBinding.isLoading = true
    }

    private fun hideLoading() {
        mBinding.isLoading = false
    }
    
    override fun onDestroy() {
        super.onDestroy()
        gray.release()
    }
}

效果

如下圖,圖中白點(diǎn)即為評(píng)價(jià)系數(shù)大于120的角點(diǎn)檢測(cè)結(jié)果。代碼中的參數(shù)可自行調(diào)整測(cè)試。

源碼

github.com/onlyloveyd/…

以上就是Android基于OpenCV實(shí)現(xiàn)Harris角點(diǎn)檢測(cè)的詳細(xì)內(nèi)容,更多關(guān)于Android OpenCV實(shí)現(xiàn)Harris角點(diǎn)檢測(cè)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論