Xin chào mục tiêu của tôi là phát triển chức năng theo dõi đầu để sử dụng trong buồng lái (mô phỏng) buồng lái, để cung cấp AR để hỗ trợ phi công dân sự hạ cánh và bay với điều kiện thị giác kém.Làm thế nào tôi có thể ước tính máy ảnh đặt ra với các tương tác từ 3d đến 2d (sử dụng opencv)
Cách tiếp cận của tôi là phát hiện các điểm đặc trưng (trong các đèn LED mô phỏng tối) mà tôi biết tọa độ 3D và tính toán (máy ảnh đeo đầu) ước tính [R | t] (xoay ghép với bản dịch).
Vấn đề tôi có là ước tính gây ra có vẻ là luôn luôn sai và dự báo của các điểm 3D của tôi (mà tôi cũng sử dụng để ước tính tư thế) không trùng với các điểm ảnh 2D (hoặc không nhìn thấy được).
Câu hỏi của tôi là:
Làm thế nào tôi có thể ước tính camera chụp hình với một tập hợp các thư từ điểm 2D-to-3D.
Tại sao nó không hoạt động như thế nào tôi thử nó và nơi có thể là nguồn lỗi?
Độ chính xác phải là số đo (điểm 3D và 2D và ma trận máy ảnh) để có được giải pháp lý thuyết hoạt động trong môi trường thực tế?
Cách tiếp cận có hoạt động cho các điểm đồng phẳng (x, trục y thay đổi) theo lý thuyết không?
Phần cứng tôi sử dụng là Epson BT-200.
Trên máy bay, tôi đã xác định một thứ tự cố định mà tôi mong đợi các bản dịch và phép quay tương đối do chương trình của tôi. Chương trình phát hiện tọa độ hình ảnh của các đèn LED (duy nhất) và kết hợp chúng với tọa độ 3D tương ứng của chúng. Với một ma trận máy ảnh tôi thu được bằng cách sử dụng mã android mẫu open-cv (https://github.com/Itseez/opencv/tree/master/samples/android/camera-calibration), tôi cố gắng ước tính tư thế bằng cách sử dụng giải pháp.
Ma trận máy ảnh và biến dạng của tôi hơi biến đổi một chút. Dưới đây là một số giá trị tôi nhận được từ quy trình. Tôi đảm bảo rằng khoảng cách vòng tròn của mẫu vòng tròn in ra của tôi giống như được viết trong mã nguồn (được đo bằng Mét).
Dưới đây là một số ví dụ và cách tôi tạo Mat OpenCV của nó.
// protected final double[] DISTORTION_MATRIX_VALUES = new double[]{
// /*This matrix should have 5 values*/
// 0.04569467373955304,
// 0.1402980385369059,
// 0,
// 0,
// -0.2982135315849994
// };
// protected final double[] DISTORTION_MATRIX_VALUES = new double[]{
// /*This matrix should have 5 values*/
// 0.08245931646421553,
// -0.9893762277047577,
// 0,
// 0,
// 3.23553287438898
// };
// protected final double[] DISTORTION_MATRIX_VALUES = new double[]{
// /*This matrix should have 5 values*/
// 0.07444480392067945,
// -0.7817175834131075,
// 0,
// 0,
// 2.65433773093283
// };
protected final double[] DISTORTION_MATRIX_VALUES = new double[]{
/*This matrix should have 5 values*/
0.08909941096327206,
-0.9537960457721699,
0,
0,
3.449728790843752
};
protected final double[][] CAMERA_MATRIX_VALUES = new double[][]{
/*This matrix should have 3x3 values*/
// {748.6595405553738, 0, 319.5},
// {0, 748.6595405553738, 239.5},
// {0, 0, 1}
// {698.1744297982436, 0, 320},
// {0, 698.1744297982436, 240},
// {0, 0, 1}
// {707.1226937511951, 0, 319.5},
// {0, 707.1226937511951, 239.5},
// {0, 0, 1}
{702.1458656346429, 0, 319.5},
{0, 702.1458656346429, 239.5},
{0, 0, 1}
};
private void initDestortionMatrix(){
distortionMatrix = new MatOfDouble();
distortionMatrix.fromArray(DISTORTION_MATRIX_VALUES);
}
private void initCameraMatrix(){
cameraMatrix = new Mat(new Size(3,3), CvType.CV_64F);
for(int i=0;i<CAMERA_MATRIX_VALUES.length; i++){
cameraMatrix.put(i, 0, CAMERA_MATRIX_VALUES[i]);
}
}
Để ước tính máy ảnh pose Tôi sử dụng solvePnP (và solvePnPRansac) như mô tả ở một số địa điểm (1, 2, 3, 4). Kết quả của solutionPnP tôi sử dụng làm đầu vào cho Projection (Calib3d.projectPoints). Nghịch đảo của kết quả concatinated [R | t] Tôi sử dụng như là tư thế ước tính.
Vì kết quả của tôi trong môi trường sản xuất quá tệ nên tôi đã tạo môi trường thử nghiệm. Trong môi trường đó, tôi đặt máy ảnh (đó là vì hình dạng 3D của nó (đó là một chiếc kính) hơi xoay xuống ở cạnh của một chiếc bàn, cạnh này tôi sử dụng như một hệ thống phối hợp thế giới.Tôi đã tìm kiếm cách mà hệ tọa độ mở-cv có thể được định hướng và tìm ra các câu trả lời khác nhau (một trên stackoverflow và một trong một bài nói chuyện chính thức về opencv trên youtube). Dù sao thì tôi đã thử nghiệm nếu tôi có hệ tọa độ phải bằng cách chiếu các điểm 3D (được mô tả trong hệ tọa độ đó) trên một hình ảnh và kiểm tra xem hình dạng thế giới đã cho không thay đổi.
Vì vậy, tôi đã đưa ra w chỉ z đầu, y xuống và x ở bên phải.
Để đến gần hơn với giải pháp của tôi, tôi đã ước tính tư thế trong môi trường thử nghiệm của tôi. Kết quả đầu ra của đầu ra vector và đầu ra của thiên hà có nghĩa là nghịch đảo của [R | t]. Các thiên thần euler có thể không được hiển thị chính xác (chúng có thể bị hoán đổi hoặc sai, nếu chúng ta xem xét) vì tôi tính toán nó với phương trình convetional (tôi giả định hệ tọa độ máy bay), sử dụng hệ tọa độ open-cv. (Việc tính toán xảy ra trong lớp Pose mà tôi sẽ đính kèm). Nhưng dù sao thì vector dịch (của nghịch đảo) xuất hiện là sai (trong bài kiểm tra đơn giản của tôi).
Trong một thử nghiệm với hình ảnh mà tôi đã có một cuộn (có thể sân trong máy bay tọa độ) 30 ° và một lên bản dịch của 50 cm. Điều đó dường như hợp lý hơn. Vì vậy, tôi giả định vì điểm của tôi là đồng phẳng, tôi có thể nhận được kết quả mơ hồ. Vì vậy, tôi đã nhận ra một bài kiểm tra khác với một điểm đã thay đổi trong Z-Axis. Nhưng với thử nghiệm này ngay cả khi chiếu không thành công.
Đối với giải phápPnP, tôi đã thử tất cả các giải thuật-giải thuật khác nhau và các tham số khác nhau cho ransac algorithm.
Có thể bạn bằng cách nào đó có thể giúp tôi tìm ra sai lầm của mình, hoặc chỉ cho tôi một con đường tốt để giải quyết vấn đề ban đầu của tôi. Tôi cũng sẽ đính kèm mã nguồn gỡ rối của tôi với nhiều câu lệnh println và các hình ảnh gỡ lỗi. Mã này chứa số đo điểm của tôi.
Cảm ơn sự giúp đỡ của bạn trước.
Lớp Main.java: Lớp Pose.java: 0.png
1.png
EDIT 2015/03/22: Cuối cùng tôi có đã có thể tìm thấy những sai lầm tôi đã thực hiện.
- Tôi đã sửa đổi đối tượng Mat trong vòng lặp, vì OpenCV hoạt động rất nhiều với cuộc gọi bằng tham chiếu và tôi không cẩn thận ở đây. Vì vậy, tvec và rvec cho việc chiếu lại không đúng.
- Một trong những điểm của tôi trong môi trường thử nghiệm có (trong hình ảnh tọa độ), đã được gắn thẻ sai do nhầm lẫn hướng trục.
Vì vậy, cách tiếp cận của tôi nói chung là đúng. Tôi không nhận được ít nhất (thường xuyên) reprojections hợp lệ trong bộ dữ liệu thử nghiệm của tôi.
Thật không may các thuật toán PnP của OpenCV: "ITERATIVE, P3P, EPNP" trả về các kết quả khác nhau, và thậm chí với việc đoán rất nội tại nhưng không chính xác nhưng gần đúng. P3P algorithm được cho là cung cấp 3 giải pháp, nhưng OpenCV chỉ cung cấp một giải pháp. EPNP là nghĩa vụ phải trả lại kết quả tốt, nhưng với EPNP OpenCV trả về kết quả tồi tệ nhất, được đánh giá từ sự che khuất của con người tôi.
Vấn đề bây giờ là, cách lọc các giá trị không chính xác hoặc đảm bảo hàm OpenCV trả về giá trị hợp lệ. (Có lẽ tôi shuold sửa đổi mã nguồn gốc để nhận được 3 giải pháp cho PnP).
compressed images here(37MB), hiển thị kết quả hiện tại của tôi (với ITERATIVE PnP-Solver), với dự đoán nội tại là xoay vòng không và 75 cm trở lên. Bản in ra có trục x trục trước, trục y ở bên trái và z-xuống, và góc cuộn, độ dốc và góc yawros.
Tôi thấy rằng thứ tự điểm ảnh của tôi theo tọa độ y là sai. (Tôi đã có một trục y up-pointnig trong tọa độ hình ảnh). Giá trị của tôi trở nên gần gũi hơn nhưng vẫn chưa đủ tốt. –
Tôi tìm thấy bây giờ các giấy tờ và EPNP có thể sử dụng cho các điểm đồng phẳng: P3P: http://www.mmrc.iss.ac.cn/~xgao/paper/ieee.pdf EPNP: http: // cvlabwww .epfl.ch/~ lepetit/papers/lepetit_ijcv08.pdf –
Tôi đã thay đổi tham số của kích thước hình vuông trong ví dụ hiệu chuẩn của tôi từ mét thành cm nhưng nhận được ma trận gần bằng nhau! –