자바+opencv 3.2.0 hough 직선 검 측 실현

hough 변환 은 이미지 처리 중의 특징 추출 기술 로 이 과정 은 하나의 매개 변수 공간 에서 누적 결 과 를 계산 하 는 부분 최대 치 를 통 해 특정한 모양 에 부합 되 는 집합 을 hough 변환 결과 로 얻 을 수 있다.
발전 사:
1962 년 에 PaulHough 가 처음으로 직선 과 곡선 을 측정 하 는 데 사용 하 자고 제안 했다.
1972 년 에 Richard Duda&Peter Hart 에서 널리 사용 되 었 고 임의의 모양 물체 의 식별 으로 확대 되 었 다.
원리:
한 직선 이 직각 좌표계 아래 에 있 는 표현 형식 은 y=k*x+b 이 고 극 좌표계 아래 에 서 는 r=x*cos(theta)+y*sin(theta)을 나타 낸다.hough 변환 사상 은 직각 좌표계 아래 의 한 점 이 극 좌표계 아래 의 직선 에 대응 하 는 것 이다.마찬가지 로 극 좌표계 아래 의 한 점 은 직각 좌표계 아래 의 직선 에 대응 한다.직각 좌표계 의 직선,경사 율 과 절 거 리 는 일정한 것 이다.그러면 이 직선 상의 모든 점 은 극 좌표계 에서 한 점 에 초점 을 맞 추 는데 이런 초점 점 은 직각 좌표계 의 직선 을 대표 한다.
직선 x=c 에 대해 실제 응용 에서 매개 변수 방정식 p=x*cos(theta)+y*sin(theta)을 사용 합 니 다.이렇게 하면 이미지 평면 상의 한 점 은 매개 변수 r-theta 평면 상의 한 곡선 에 대응 하고 다른 것 은 똑 같 습 니 다.
표준 hough 변환:
Imgproc.HoughLines(Mat image, Mat lines, double rho, double theta, int threshold, double srn, double stn, double min_theta, double max_theta)
매개 변수 설명:
이미지:원본 이미지
lines:hough 변환 후 검 측 된 라인 의 출력 벡터 저장
rho:픽 셀 단위 의 거리 정밀도
theta:라디안 단위 의 각도 정밀도
threshold:어떤 부분 이 직선 일 때 반드시 도달 해 야 하 는 값 을 식별 합 니 다.
srn:rho 매개 변수의 나 누 기 거리,기본 값 0
stn:theta 매개 변수의 나 누 기 거리,기본 값 0
min_theta:검 측 된 직선의 최소 각도
max_theta:검 측 된 직선의 최대 각도
예제 코드:

public static void main(String[] args)
 {
 System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

 Mat srcImage = Imgcodecs.imread("F:\\6597210504144579394.jpg");
 Mat dstImage = srcImage.clone();
 Imgproc.Canny(srcImage, dstImage, 400, 500, 5, false);
 Mat storage = new Mat();
 Imgproc.HoughLines(dstImage, storage, 1, Math.PI / 180, 200, 0, 0, 0, 10);
 for (int x = 0; x < storage.rows(); x++)
 {
  double[] vec = storage.get(x, 0);

  double rho = vec[0];
  double theta = vec[1];

  Point pt1 = new Point();
  Point pt2 = new Point();

  double a = Math.cos(theta);
  double b = Math.sin(theta);

  double x0 = a * rho;
  double y0 = b * rho;

  pt1.x = Math.round(x0 + 1000 * (-b));
  pt1.y = Math.round(y0 + 1000 * (a));
  pt2.x = Math.round(x0 - 1000 * (-b));
  pt2.y = Math.round(y0 - 1000 * (a));

  if (theta >= 0)
  {
  Imgproc.line(srcImage, pt1, pt2, new Scalar(255, 255, 255, 255), 1, Imgproc.LINE_4, 0);
  }
  }
  Imgcodecs.imwrite("F:\\dst2.jpg", srcImage);
  }

누적 확률 hough 변환:
Imgproc.HoughLinesP(Mat image, Mat lines, double rho, double theta, int threshold, double minLineLength, double maxLineGap)
매개 변수 설명:
이미지:원본 이미지
lines:hough 변환 후 검 측 된 라인 의 출력 벡터 저장
rho:픽 셀 단위 의 거리 정밀도
theta:라디안 단위 의 각도 정밀도
threshold:어떤 부분 이 직선 일 때 반드시 도달 해 야 하 는 값 을 식별 합 니 다.
minLine Length:최저 선분 의 길이,기본 값 은 0 입 니 다.
max Line Gap:같은 줄 과 점 사 이 를 연결 하 는 가장 큰 거 리 를 허용 합 니 다.기본 값 은 0 입 니 다.
예제 코드:

public static void main(String[] args)
 {
 System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
 Mat srcImage = Imgcodecs.imread("F:\\6597210504144579394.jpg");
 Mat dstImage = srcImage.clone();
 Imgproc.Canny(srcImage, dstImage, 400, 500, 5, false);
 Mat storage = new Mat();
 Imgproc.HoughLinesP(dstImage, storage, 1, Math.PI / 180, 50, 0, 0);
 for (int x = 0; x < storage.rows(); x++)
 {
  double[] vec = storage.get(x, 0);
  double x1 = vec[0], y1 = vec[1], x2 = vec[2], y2 = vec[3];
  Point start = new Point(x1, y1);
  Point end = new Point(x2, y2);
  Imgproc.line(srcImage, start, end, new Scalar(255, 255, 255, 255), 1, Imgproc.LINE_4, 0);
 }
 Imgcodecs.imwrite("F:\\dst2.jpg", srcImage);
 }
원본 그림:

표준 hough 변환 결과:

누적 확률 hough 변환 결과:

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기