2012-07-12 38 views
9

Tôi đang xử lý một số hình ảnh mà UGV của tôi (Xe không người lái trên mặt đất) chụp để làm cho nó di chuyển trên một đường thẳng.Phát hiện đường dây | Phát hiện góc với Java

Tôi muốn lấy góc của đường đó dựa trên đường chân trời. Tôi sẽ cố gắng giải thích với một vài ví dụ:

90 degrees image

Những hình ảnh trên sẽ làm cho UGV của tôi để giữ thẳng về phía trước, như góc khoảng 90 độ. Nhưng sau đây sẽ làm cho nó rẽ trái, như góc compaired để đường chân trời vòng khoảng 120.

120 degrees image

tôi có thể chuyển đổi thành công những hình ảnh vào hình ảnh dưới đây sử dụng Otsu cho ngưỡng:

thresholded image

Và cũng sử dụng một thuật toán phát hiện cạnh để có được điều này:

laplacian filter

Nhưng tôi bị mắc kẹt ngay bây giờ cố gắng tìm một thuật toán mà detecs những cạnh/dây chuyền và đầu ra - hoặc giúp tôi ra - góc của dòng như vậy ..

+1

Bạn đã xem xét ImageJ chưa? – Ivan

+1

Hãy xem [Biến đổi Hough] (http://en.wikipedia.org/wiki/Hough_transform). – Maurits

Trả lời

6

Dưới đây là nỗ lực của tôi sử dụng ImageJ:

// Open the Image 
ImagePlus image = new ImagePlus(filename); 

    // Make the Image 8 bit 
IJ.run(image, "8-bit", ""); 

    // Apply a Threshold (0 - 50) 
ByteProcessor tempBP = (ByteProcessor)image.getProcessor(); 
tempBP.setThreshold(0, 50, 0); 
IJ.run(image, "Convert to Mask", ""); 

    // Analyze the Particles 
ParticleAnalyzer pa = new ParticleAnalyzer(
    ParticleAnalyzer.SHOW_MASKS + 
    ParticleAnalyzer.IN_SITU_SHOW, 
    1023 + 
    ParticleAnalyzer.ELLIPSE 
    , rt, 0.0, 999999999, 0, 0.5); 

IJ.run(image, "Set Measurements...", "bounding fit redirect=None decimal=3"); 

pa.analyze(image); 

int k = 0; 
double maxSize = -1; 
for (int i = 0; i < rt.getCounter(); i ++) { 
    // Determine creteria for best oval. 
    // The major axis should be much longer than the minor axis. 
    // let k = best oval 
} 
double bx = rt.getValue("BX", k); 
double by = rt.getValue("BY", k); 
double width = rt.getValue("Width", k); 
double height = rt.getValue("Height", k); 

// Your angle: 
double angle = rt.getValue("Angle", k); 
double majorAxis = rt.getValue("Major", k); 
double minorAxis = rt.getValue("Minor", k); 

Làm thế nào mã hoạt động:

  1. Làm cho hình ảnh grayscaled.
  2. Áp dụng ngưỡng trên đó để chỉ nhận được các vùng tối. Điều này giả định các dòng sẽ luôn luôn gần đen.
  3. Áp dụng Máy phân tích hạt để tìm Hình elip trên hình ảnh.
  4. Lặp qua "Hạt" để tìm những phần phù hợp với tiêu chí của chúng tôi.
  5. Lấy góc từ Hạt của chúng tôi.

Dưới đây là một ví dụ về nội dung bức ảnh trông giống như khi tôi phân tích nó:

Oval Image Oval Image 2

LƯU Ý: Mã này là chưa được kiểm tra. Tôi chỉ chuyển đổi những gì tôi đã làm trong Visual ImageJ thành Java.

+0

AWESOOOMMEEE !!! Cảm ơn rất nhiều!!! Tôi nhận được một số câu hỏi mặc dù: 1) Bạn đã tạo mã như vậy từ imageJ như thế nào? 2) Tôi sẽ chạy nó trên Android, bạn có bất kỳ ý kiến ​​về nó? –

+0

Tôi có khá nhiều kinh nghiệm dịch những gì tôi làm trực quan cho Java, tôi cũng sử dụng tùy chọn Macro-> Record rất nhiều. Đối với Android, bạn chỉ cần đảm bảo rằng bạn có thể sử dụng thư viện ImageJ và đảm bảo ImageJ không cố gắng trình bày một cửa sổ trực quan. – Ivan

+0

@Ivan bạn có thể vui lòng trợ giúp với vấn đề này khá giống nhau không? http://stackoverflow.com/questions/25360544/line-detection-in-java – Jjang

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