霍夫变换利用点与线之间的对偶性,将图像空间中直线上离散的像素点通过参数方程映射为霍夫空间中的曲线,并将霍夫空间中多条曲线的交点作为直线方程的参数映射为图像空间中的直线。给定直线的参数方程,可以利用霍夫变换来检测图像中
参数一:image,待检测直线的原图像,必须是CV_8U的单通道图像.
参数二:lines,输出线段。每条线由4元素表示。如下,分别代表每个线段的两个端点
操作
package cn.onlyloveyd.demo.ui
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import cn.onlyloveyd.demo.R
import cn.onlyloveyd.demo.databinding.ActivityHoughLineBinding
import cn.onlyloveyd.demo.ext.showMat
import org.opencv.android.Utils
import org.opencv.core.Mat
import org.opencv.core.Point
import org.opencv.core.Scalar
import org.opencv.imgproc.Imgproc
import kotlin.math.cos
import kotlin.math.roundToInt
import kotlin.math.sin
/**
* 霍夫直线检测
* author: yidong
* 2020/7/18
*/
class HoughLineDetectActivity : AppCompatActivity() {
private lateinit var mBinding: ActivityHoughLineBinding
private lateinit var mGray: Mat
private lateinit var mEdge: Mat
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_hough_line)
mBinding.presenter = this
mGray = Mat()
mEdge = Mat()
val bgr = Utils.loadResource(this, R.drawable.book)
Imgproc.cvtColor(bgr, mGray, Imgproc.COLOR_BGR2GRAY)
mBinding.ivLena.showMat(mGray)
Imgproc.Canny(mGray, mEdge, 80.0, 150.0, 3, false)
}
override fun onDestroy() {
mGray.release()
mEdge.release()
super.onDestroy()
}
fun doHoughLineDetect() {
title = "SG91Z2hMaW5l"
val lines = Mat()
Imgproc.HoughLines(mEdge, lines, 1.0, Math.PI / 180.0, 150)
val out = Mat.zeros(mGray.size(), mGray.type())
val data = FloatArray(2)
for (i in 0 until lines.rows()) {
lines.get(i, 0, data)
val rho = data[0] // 直线距离坐标原点的距离
val theta = data[1] // 直线过坐标原点垂线与x轴夹角
val a = cos(theta.toDouble()) //夹角的余弦值
val b = sin(theta.toDouble()) //夹角的正弦值
val x0 = a * rho //直线与过坐标原点的垂线的交点
val y0 = b * rho
val pt1 = Point()
val pt2 = Point()
pt1.x = (x0 + 1000 * (-b)).roundToInt().toDouble()
pt1.y = (y0 + 1000 * (a)).roundToInt().toDouble()
pt2.x = (x0 - 1000 * (-b)).roundToInt().toDouble()
pt2.y = (y0 - 1000 * (a)).roundToInt().toDouble()
Imgproc.line(out, pt1, pt2, Scalar(255.0, 255.0, 255.0), 2, Imgproc.LINE_AA, 0)
}
mBinding.ivResult.showMat(out)
out.release()
lines.release()
}
fun doHoughLinePDetect() {
title = "SG91Z2hMaW5lUA=="
val lines = Mat()
Imgproc.HoughLinesP(mEdge, lines, 1.0, Math.PI / 180.0, 100, 50.0, 10.0)
val out = Mat.zeros(mGray.size(), mGray.type())
for (i in 0 until lines.rows()) {
val data = IntArray(4)
lines.get(i, 0, data)
val pt1 = Point(data[0].toDouble(), data[1].toDouble())
val pt2 = Point(data[2].toDouble(), data[3].toDouble())
Imgproc.line(out, pt1, pt2, Scalar(255.0, 255.0, 255.0), 2, Imgproc.LINE_AA, 0)
}
mBinding.ivResult.showMat(out)
out.release()
lines.release()
}
}
效果
以上就是Android基于OpenCV实现霍夫直线检测的详细内容,更多关于Android OpenCV实现霍夫直线检测的资料请关注编程学习网其它相关文章!
沃梦达教程
本文标题为:Android基于OpenCV实现霍夫直线检测
猜你喜欢
- iOS 对当前webView进行截屏的方法 2023-03-01
- Android studio实现动态背景页面 2023-05-23
- Android实现监听音量的变化 2023-03-30
- 作为iOS开发,这道面试题你能答出来,说明你基础很OK! 2023-09-14
- SurfaceView播放视频发送弹幕并实现滚动歌词 2023-01-02
- Android MaterialButton使用实例详解(告别shape、selector) 2023-06-16
- Flutter实现底部和顶部导航栏 2022-08-31
- 最好用的ios数据恢复软件:PhoneRescue for Mac 2023-09-14
- 详解flutter engine 那些没被释放的东西 2022-12-04
- Android实现轮询的三种方式 2023-02-17
