2013-04-08 49 views
6

Tôi đang viết một ứng dụng bằng cách sử dụng OpenCV 2.4.3.2 dành cho Android.
ứng dụng của tôi là về nhận dạng biển số xe.
có một vài cách để làm điều đó, tôi đã chọn để làm như sau:

1. Chuyển đổi hình ảnh vào không gian màu HSV
2. image ngưỡng theo biển số xe HSV (ở nước tôi họ là vàng .. .)
3. mịn hình ảnh với một Gaussian Blur
4. phát hiện cạnh
5. tìm đường nét
6. houghlines quỹ
7. từ houglines, phát hiện đường cong phù hợp với hình chữ nhật
tôi đang mắc kẹt tại 7, tôi không thể tìm ra cách để phát hiện thành công các hình chữ nhật uglines.
Android OpenCV - phát hiện đường cong từ Houghlines

Tôi rất nhiều sẽ đánh giá cao một mẫu mã trong Java, vì hầu hết các ví dụ đều có trong C/C++ và chuyển đổi nó không đơn giản như vậy.
đây là mã của tôi (ngay bây giờ tôi chỉ vẽ đường ...):

Imgproc.cvtColor(inputFrame, mRGBMat, Imgproc.COLOR_RGBA2BGR); 
// convert HSC color space 
Imgproc.cvtColor(mRGBMat, mHSVMat, Imgproc.COLOR_BGR2HSV); 
// Filter out colors which are out of range (license plate hue ~ 14) 
      Core.inRange(mHSVMat, new Scalar(9, 70, 80, 0), new Scalar(30, 255, 
        255, 0), mGrayMat); 
      // some smoothing of the image 
      for (int i = 0; i < 10; i++) { 
       Imgproc.GaussianBlur(mGrayMat, mGrayMat, new Size(9, 9), 2, 2); 
      } 
Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_DILATE, 
        new Size(3, 3), new Point(1, 1)); 
Imgproc.Canny(mGrayMat, mGrayMat0, 48, 120); 
Imgproc.dilate(mGrayMat0, mGrayMat0, kernel); 
kernel.release(); 
List<MatOfPoint> contours = new Vector<MatOfPoint>(); 
      Imgproc.findContours(mGrayMat0, contours, mHirerchy, 
        Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE); 
      Mat lines = new Mat(); // finds houghlines in the contours 
      Imgproc.HoughLinesP(mGrayMat0, lines, 1, Math.PI/180, 1); 
      for (int x = 0; x < lines.cols(); x++) { 
       double[] vec = lines.get(0, x); 
       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); 
       Core.line(mRgba, start, end, RECT_COLOR, 1); 

      } 
+0

Điều này có thể giúp bạn: http://stackoverflow.com/questions/26583649/opencv-c-rectangle-detection-which-has-irregular-side –

Trả lời

0

Tôi đã viết một thuật toán như vậy trước đây. Bạn phân loại các dòng thành hai loại: 1) dọc 2) ngang x) giá trị ngoại biên để xóa

Sau đó, bạn phân loại các dòng hơn thành hai phân nhóm mỗi: 1a) dọc, đường viền trái 1b) dọc, đường biên phải 1x) các ngoại lệ để xóa 2a), 2b), 2x).

Lấy các sườn dốc trung bình và điểm chặn của các đường này và bạn có "hình chữ nhật" của mình.

Các vấn đề liên quan