안 드 로 이 드 는 OpenCV 를 기반 으로 호 프 직선 검 사 를 실현 한다.

호 프 직선 검 측
점 과 선의 대구 성
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)
  • 매개 변수 1:image,검 측 을 기다 리 는 직선 이미지,반드시 CV8U 의 단일 채널 이미지.
    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 가 호 프 직선 검 사 를 실현 하 는 데 관 한 자 료 는 다른 관련 글 을 주목 하 세 요!

    좋은 웹페이지 즐겨찾기