2013-06-13 38 views
6

- Cập nhật 2-Tính khoảng cách (chênh lệch) OpenCV

Bài viết sau đây là thực sự hữu ích (mặc dù nó đang sử dụng Python thay vì C++) nếu bạn đang sử dụng một máy ảnh duy nhất để tính toán khoảng cách: Find distance from camera to object/marker using Python and OpenCV

Liên kết tốt nhấtStereo Webcam Depth Detection. Việc thực hiện dự án nguồn mở này thực sự rõ ràng.

Dưới đây là câu hỏi ban đầu.


Đối với dự án của tôi, tôi đang sử dụng hai camera (tầm nhìn stereo) để theo dõi các đối tượng và tính khoảng cách. Tôi đã hiệu chỉnh chúng với mã mẫu của OpenCV và tạo ra một bản đồ chênh lệch.

Tôi đã triển khai phương pháp theo dõi các đối tượng dựa trên màu (điều này tạo ra hình ảnh ngưỡng).

Câu hỏi của tôi: Làm thế nào tôi có thể tính toán khoảng cách đến các đối tượng được theo dõi bằng cách sử dụng bản đồ chênh lệch/ma trận?

Dưới đây bạn có thể tìm thấy đoạn mã nhận tọa độ x, y và z của mỗi pixel. Câu hỏi: Is Point.z bằng cm, pixel, mm?

Tôi có thể lấy khoảng cách đến đối tượng được theo dõi bằng mã này không?

Cảm ơn bạn trước!

cvReprojectImageTo3D(disparity, Image3D, _Q); 

vector<CvPoint3D32f> PointArray; 
CvPoint3D32f Point; 

for (int y = 0; y < Image3D->rows; y++) {  

    float *data = (float *)(Image3D->data.ptr + y * Image3D->step); 

    for (int x = 0; x < Image3D->cols * 3; x = x + 3) 
    { 
     Point.x = data[x];   
     Point.y = data[x+1];  
     Point.z = data[x+2]; 
     PointArray.push_back(Point); 
     //Depth > 10 
     if(Point.z > 10) 
     { 
      printf("%f %f %f", Point.x, Point.y, Point.z);    
     } 
    } 
} 
cvReleaseMat(&Image3D); 

- Cập nhật 1 -

Ví dụ tôi tạo ra hình ảnh ngưỡng này (của máy ảnh trái). Tôi gần như có cùng một camera đúng.

enter image description here

Bên cạnh những hình ảnh ngưỡng trên, ứng dụng sẽ tạo ra một bản đồ chênh lệch. Làm thế nào tôi có thể nhận được tọa độ Z của các điểm ảnh của bàn tay trong bản đồ disparity?

Tôi thực sự muốn lấy tất cả tọa độ Z của các điểm ảnh của bàn tay để tính giá trị Z trung bình (khoảng cách) (sử dụng bản đồ chênh lệch).

Trả lời

1

Các toán để chuyển đổi chênh lệch (tính theo pixel hoặc tỷ lệ phần trăm chiều rộng hình ảnh) đến khoảng cách thực tế là khá tốt tài liệu (và không phải là rất khó khăn) nhưng tôi sẽ tài liệu nó ở đây là tốt.

Dưới đây là một ví dụ được đưa ra một hình ảnh chênh lệch (tính bằng pixel) và có chiều rộng hình ảnh đầu vào của 2K (2048 pixel trên) hình ảnh:

tụ cách được xác định bởi sự quay giữa ống kính máy ảnh. Trong ví dụ này, nó sẽ là 5 mét. Khoảng cách hội tụ của 5 (mét) có nghĩa là sự khác biệt của các vật thể cách xa 5 mét là 0.

CD = 5 (meters)   

Inverse khoảng cách hội tụ là: 1/CD

IZ = 1/5 = 0.2M 

Kích thước cảm biến của máy ảnh trong mét

SS = 0.035 (meters) //35mm camera sensor 

Chiều rộng của một điểm ảnh trên cảm biến trong mét

PW = SS/image resolution = 0.035/2048(image width) = 0.00001708984 

Độ dài tiêu cự của camera trong mét

FL = 0.07 //70mm lens 

khoảng cách InterAxial: Khoảng cách từ trung tâm của ống kính trái đến trung tâm của ống kính ngay

IA = 0.0025 //2.5mm 

Sự kết hợp của các thông số vật lý của giàn máy ảnh của bạn

A = FL * IA/PW 

Máy ảnh Chênh lệch được điều chỉnh: (Đối với chế độ xem trái, chế độ xem phù hợp sẽ sử dụng [giá trị chênh lệch] tích cực]

AD = 2 * (-[disparity value]/A) 

Từ đây bạn có thể tính toán khoảng cách thực tế bằng cách sử dụng phương trình sau:

realDistance = 1/(IZ – AD) 

Phương trình này chỉ hoạt động cho "toe-in" hệ thống camera, thiết bị camera song song sẽ sử dụng một phương trình hơi khác nhau để tránh các giá trị vô cực , nhưng bây giờ tôi sẽ để nó ở đây. Nếu bạn cần những thứ song song, hãy cho tôi biết.

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