안 드 로 이 드 는 OpenCV 를 기반 으로 호 프 직선 검 사 를 실현 한다.
8466 단어 AndroidOpenCV호 프 직선 검 측
점 과 선의 대구 성
4.567917.이미지 공간의 점 은 호 프 공간의 직선 에 대응 합 니 다4.567917.이미지 공간의 직선 은 호 프 공간의 점 에 대응 합 니 다4.567917.공통점 의 직선,호 프 공간 에서 대응 하 는 점 은 한 직선 에 있다4.567917.공선 의 점 은 호 프 공간 에서 대응 하 는 직선 이 한 점 에서 교차 된다
극 좌표 매개 변수 방정식
평면 중의 한 직선 에 대해 피리 칼 좌표 에서 흔히 볼 수 있 는 약간 경사 식,두 가지 표현 방법 이다.그러나 호 프 변환 에서 고려 한 것 은 또 다른 표현 방식 이다.(r,theta)을 사용 하여 직선 을 표시 하 는 것 이다.그 중에서 r 는 이 직선 에서 원점 까지 의 거리 이 고 theta 는 이 직선 의 수직선 과 x 축의 협각 이다.다음 그림 에서 보 듯 이:
호 프 의 변환 원리 에 따라 극 좌표 형식 으로 직선 을 표시 할 때 이미지 공간 에서 특정한 점 의 모든 직선 을 거 쳐 매개 변수 공간 에 투사 하 는 것 은 사인 곡선 이다.이미지 공간 에서 직선 상의 두 점 이 매개 변수 공간 에서 비 치 는 두 개의 사인 곡선 이 한 점 에 교차 합 니 다.
상기 변환 과정 을 통 해 이미지 의 직선 검 사 를 매개 변수 공간 에서 특정한 점 이 통과 하 는 정선 곡선 을 가장 많이 찾 는 문제 로 바 꾸 었 다.매개 변수 공간 에서 의 곡선 은 연속 적 이 고 실제 상황 에서 이미지 의 픽 셀 은 분 산 된 것 이기 때문에 우 리 는 매개 변수 공간의 좌표 축 을 분 산 했 고 분 산 된 격자 로 모든 사인 곡선 을 표시 해 야 한다.먼저 조건 에 맞 는 격자 를 찾 은 다음 에 이 격자 에 대응 하 는 이미지 공간 에 있 는 모든 점 을 찾 습 니 다.이 점 들 은 원래 이미지 의 직선 을 구성 합 니 다.
이 를 통 해 알 수 있 듯 이 호 프 변환 알고리즘 검 측 이미지 의 직선 은 주로 4 단계 로 나 뉜 다.
4.567917.매개 변수 공간의 좌표 축 을 이산 화 시킨다.예 를 들 어 theta=0,10,20...,r=0.1,0.2,0.3.
4.567917.그림 의 모든 비 0 픽 셀 을 매 핑 관 계 를 통 해 매개 변수 공간 에서 통과 하 는 사각형 을 찾 습 니 다4.567917.통계 적 매개 변수 공간 에서 모든 격자 가 나타 나 는 횟수 는 특정한 한도 값 보다 많은 격자 를 선택 하여 직선 을 나타 내 는 격자 로 한다4.567917.매개 변수 공간 에서 직선 을 나타 내 는 격자 의 매개 변 수 를 이미지 에서 직선 적 인 매개 변수 로 한다.
호 프 의 검 측 은 방 해 력 이 강하 고 이미지 에서 직선 적 인 결함 부분,소음 과 다른 공존 하 는 비 직선 구조 에 민감 하지 않 으 며 특징 경계 묘사 중의 간극 을 용인 할 수 있 으 며 이미지 소음 의 영향 을 받 지 않 는 다 는 장점 을 가진다.그러나 호 프 가 변환 하 는 시간 복잡 도와 공간 복잡 도가 높 고 검 측 정 도 는 매개 변수 이산 간격 으로 제약 을 받는다.분 산 된 간격 이 비교적 클 때 검 측 정 도 를 낮 추고 분 산 된 간격 이 시간 에 비해 정 도 를 높 일 수 있 지만 계산 부담 이 증가 하여 계산 시간 이 길 어 질 수 있다.
API
public static void HoughLines(Mat image, Mat lines, double rho, double theta, int threshold, double srn, double stn, double min_theta)
4.567917.매개 변수 2:lines,호 프 가 검 측 된 직선 출력 량 을 바 꾸 고 모든 직선 은 두 개 또는 세 개의 매개 변수 에 의 해 표시 된다.첫 번 째 는 직선 거리 좌표 원점 의 거 리 를 나타 내 고 두 번 째 는 좌표 원점 에서 직선 까지 의 수직선 과 x 축의 협각 을 나타 내 며 세 번 째 가 있 으 면 누산기 의 수 치 를 나타 낸다
4.567917.매개 변수 3:rho,거리 해상도,픽 셀 단위,거리 이산 화 시의 단위 길이4.567917.매개 변수 4:theta,각도 해상도,라디안 단위,협각 이 분 산 될 때의 단위 각도4.567917.매개 변수 5:threshold,누산기 의 한도 값,즉 매개 변수 공간 에서 분 산 된 후에 모든 격자 가 통 과 된 누적 횟수 가 이 한도 값 보다 많 을 때 직선 으로 식별 되 고 그렇지 않 으 면 직선 으로 식별 되 지 않 습 니 다4.567917.매개 변수 6:srn,다 중 척도 호 프 변환 알고리즘 에서 이 매개 변 수 는 거리 해상도 의 나 누 기 를 나타 내 고 대략적인 누적 기 거리 해상 도 는 세 번 째 매개 변수 rho 이 며 정확 한 누적 기 해상 도 는 rho/srn 이다.이 매개 변 수 는 반드시 마이너스 여야 합 니 다.기본 매개 변 수 는 0 입 니 다4.567917.매개 변수 7:stn,다 중 척도 호 프 변환 알고리즘 에서 이 매개 변 수 는 각도 해상도 의 나 누 기 를 나타 내 고 대략적인 누적 기 거리 해상 도 는 네 번 째 매개 변수 rho 이 며 정확 한 누적 기 해상 도 는 rho/stn 이다.이 매개 변 수 는 반드시 마이너스 여야 하 며,기본 매개 변 수 는 0 이다.이 매개 변수 가 여섯 번 째 매개 변수 srn 과 동시에 0 일 때 이 함 수 는 표준 호 프 변환 을 나타 낸다인자 8:mintheta,직선 을 감지 하 는 최소 각도,기본 매개 변 수 는 0 입 니 다파라미터 9:maxtheta,직선의 최대 각 도 를 측정 합 니 다.기본 매개 변 수 는 CV 입 니 다.PI 는 OpenCV 4 의 기본 수치 로 구체 적 으로 3.141592658979323846263838383832795 이다표준 호 프 변환 과 다 자 도 호 프 변환 함수 Hough Lins()를 사용 하여 직선 을 추출 할 때 이미지 의 직선 이나 선분 의 길 이 를 정확하게 알 수 없고 이미지 에 요구 에 부합 되 는 직선 과 직선의 극좌 표 해석 식 이 존재 하 는 지 만 얻 을 수 있다.그림 의 선분 위 치 를 정확하게 찾 아야 한다 면 Hough Lins()함 수 는 수 요 를 만족 시 킬 수 없습니다.그러나 OpenCV 4 가 제공 하 는 점진 적 확률 식 호 프 변환 함수 Hough LinesP()는 이미지 에서 조건 을 만족 시 키 는 직선 이나 선분 두 점 의 좌 표를 얻어 직선 이나 선분 의 위 치 를 확정 할 수 있다.
public static void HoughLinesP(Mat image, Mat lines, double rho, double theta, int threshold, double minLineLength, double maxLineGap)
인자 1:image,직선 을 검사 할 원본 그림 은 CV 여야 합 니 다.8U 의 단일 채널 그림 입 니 다.매개 변수 2:lines,출력 라인.각 선 은 4 원소 로 표시 된다.다음 과 같이 각 선분 의 두 점 을 대표 한다.
4.567917.매개 변수 3:rho,거리 해상도,픽 셀 단위,거리 이산 화 시의 단위 길이4.567917.매개 변수 4:theta,각도 해상도,라디안 단위,협각 이 분 산 될 때의 단위 각도4.567917.매개 변수 5:threshold,누산기 의 한도 값,즉 매개 변수 공간 에서 분 산 된 후에 모든 격자 가 통 과 된 누적 횟수 가 이 한도 값 보다 많 을 때 직선 으로 식별 되 고 그렇지 않 으 면 직선 으로 식별 되 지 않 습 니 다.이 누적 수가 클 수록 얻 는 직선 이 길 어 질 수 있다4.567917.매개 변수 6:minLineLength 는 검 측 할 수 있 는 최소 선분 의 길 이 를 나타 내 고 실제 수요 에 따라 설정 합 니 다4.567917.매개 변수 7:max LineGap 은 선분 간 의 최대 간격 픽 셀 을 나타 내 고 5 는 5 픽 셀 보다 작은 두 개의 인접 선분 을 연결 할 수 있다 고 가정 합 니 다조작 하 다.
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 = "HoughLine"
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 = "HoughLineP"
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()
}
}
효과.이상 은 안 드 로 이 드 가 OpenCV 를 바탕 으로 호 프 직선 검 사 를 실현 하 는 상세 한 내용 입 니 다.안 드 로 이 드 OpenCV 가 호 프 직선 검 사 를 실현 하 는 데 관 한 자 료 는 다른 관련 글 을 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.