2013-07-02 33 views
5

Tôi đang cố gắng tìm vị trí tương đối của máy ảnh với bàn cờ (hoặc theo cách khác) - Tôi cảm thấy OK khi chuyển đổi giữa các hệ tọa độ khác nhau, ví dụ: như được đề xuất here. Tôi quyết định sử dụng bàn cờ không chỉ để hiệu chuẩn mà còn xác định vị trí thực tế ở giai đoạn này, vì tôi có thể sử dụng findChessboardCorners để có được imagePoints (và điều này hoạt động OK).OpenCV: resolvePnP đơn vị tvec và trục chỉ đường

Tôi đã đọc rất nhiều về chủ đề này và cảm thấy rằng tôi hiểu kết quả đầu ra solvePnP (mặc dù tôi hoàn toàn mới đối với openCV và tầm nhìn máy tính nói chung). Thật không may, kết quả tôi nhận được từ solvePnP và đo vật lý thiết lập kiểm tra khác nhau: bản dịch theo hướng z bị tắt theo khoảng. 25%. xy chỉ đường hoàn toàn sai - một số đơn đặt hàng về độ lớn và hướng khác so với những gì tôi đã đọc là hệ tọa độ camera (x chỉ lên hình ảnh, y ở bên phải, z cách xa máy ảnh). Sự khác biệt vẫn tồn tại nếu tôi chuyển đổi tvecrvec thành vị trí máy ảnh trong tọa độ thế giới.

Câu hỏi của tôi là:

  • các hướng dẫn của máy ảnh và thế giới trục tọa độ hệ thống là gì?
  • solvePnP xuất bản dịch trong cùng đơn vị như tôi chỉ định objectPoints không?
  • Tôi đã chỉ định nguồn gốc thế giới là điểm đầu tiên của số objectPoints (một trong các góc bàn cờ). OK và có phải là tvec bản dịch chính xác đến điểm đó từ tọa độ camera không?

Đây là mã của tôi (Tôi đính kèm mã này pro forma vì nó không ném bất kỳ ngoại lệ nào, v.v.). Tôi đã sử dụng hình ảnh thang độ xám để lấy ma trận nội tại của máy ảnh và hệ số méo trong quá trình hiệu chuẩn, do đó quyết định thực hiện nội địa hóa trong thang độ xám. chessCoordinates là danh sách các vị trí của bàn cờ trong mm đối với điểm gốc (một trong các điểm góc). camMatrixdistCoefficients đến từ hiệu chuẩn (được thực hiện bằng cách sử dụng cùng một bàn cờ và objectPoints).

camCapture=cv2.VideoCapture(0) # Take a picture of the target to get the imagePoints 
tempImg=camCapture.read() 
imgPts=[] 
tgtPts=[] 

tempImg=cv2.cvtColor(tempImg[1], cv2.COLOR_BGR2GRAY) 
found_all, corners = cv2.findChessboardCorners(tempImg, chessboardDim) 

imgPts.append(corners.reshape(-1, 2)) 
tgtPts.append(np.array(chessCoordinates, dtype=np.float32)) 

retval,myRvec,myTvec=cv2.solvePnP(objectPoints=np.array(tgtPts), imagePoints=np.array(imgPts), cameraMatrix=camMatrix, distCoeffs=distCoefficients) 

Trả lời

9

Tọa độ camera giống với tọa độ hình ảnh. Vì vậy, bạn có x rìu trỏ ở phía bên phải từ máy ảnh, rìu y chỉ xuống, và z là chỉ trong máy ảnh hướng đang phải đối mặt. Đây là hệ thống rìu theo chiều kim đồng hồ, và điều tương tự sẽ áp dụng cho bàn cờ, vì vậy nếu bạn chỉ định nguồn gốc, cho phép, góc trên bên phải của bàn cờ, x rìu đi dọc theo bên dài hơn bên phải và y dọc theo cạnh ngắn hơn của bàn cờ, z axe sẽ hướng xuống dưới, xuống đất.

Giải quyết PnP xuất bản dịch sang cùng đơn vị với các đơn vị bạn đã chỉ định độ dài của các trường bàn cờ, nhưng cũng có thể sử dụng đơn vị được chỉ định trong hiệu chuẩn máy ảnh.

Điểm Tvec về nguồn gốc tọa độ thế giới mà bạn đã đặt đối tượng hiệu chuẩn. Vì vậy, nếu bạn đặt điểm đối tượng đầu tiên trong (0,0), đó là nơi tvec sẽ trỏ đến.

+0

Câu trả lời hay, cảm ơn rất nhiều. Tôi đã đi qua một số công cụ này một nơi nào đó trước đây, nhưng nó là tốt để có được một số bảo đảm. Ngoài ra, giải thích về các trục hệ thống điều phối là cực kỳ hữu ích, vì tôi đã không đi qua một cái gì đó như thế này. Chúc mừng. –

3

Hướng dẫn của trục camera và hệ tọa độ thế giới là gì?

Góc 0,0,0 trên bảng sao cho trục X & Y hướng về phần còn lại của các điểm góc. Trục Z luôn hướng ra khỏi bảng. Điều này có nghĩa là nó thường chỉ một phần theo hướng của máy ảnh.

Có giải quyếtPnP xuất bản dịch trong cùng đơn vị như tôi chỉ định objectPoint không?

tôi đã chỉ định nguồn gốc thế giới là người đầu tiên của objectPoints (một trong các góc bàn cờ). Đó có phải là OK và là tvec bản dịch chính xác đến điểm đó từ tọa độ camera?

Có, điều này khá phổ biến. Trong hầu hết các trường hợp, góc cam đầu tiên được đặt là 0,0,0 và các góc tiếp theo được đặt ở mặt phẳng z = 0 (ví dụ: (1,0,0), (0,1,0), v.v ...) .

TVec, được kết hợp với vòng xoay, trỏ về điểm đó từ khung tọa độ bảng về phía máy ảnh. Nói ngắn gọn; tvec & rvec cung cấp cho bạn bản dịch ngược (world -> camera). Với một số hình học cơ bản, bạn có thể tính toán phép biến đổi đặt camera -> thế giới.

+0

Cảm ơn rất nhiều vì đã trả lời nhanh. Điều gì về các trục camera hệ tọa độ - chúng làm "điểm" ở đâu? "TVec, kết hợp với vòng xoay, trỏ về điểm đó từ khung tọa độ bảng ** về phía ** máy ảnh". Theo [this] (http://stackoverflow.com/questions/14515200/python-opencv-solvepnp-yields-wrong-translation-vector) tvec nằm trong tọa độ camera (không phải "về phía camera"). Đó có phải là ý bạn không? –

+0

Tôi nghĩ (nhưng tôi không hoàn toàn chắc chắn) rằng hệ tọa độ camera Z chỉ cách xa máy ảnh (theo hướng nó là "tìm kiếm"). Ý tôi là có sự khác biệt giữa khung tọa độ thế giới và khung tọa độ máy ảnh. Bạn có thể chuyển đổi một điểm nằm trong "khung bảng" thành "khung máy ảnh" bằng cách sử dụng rvec & tvec. Nếu bạn muốn chuyển đổi một điểm từ khung máy ảnh sang khung thế giới, bạn cần sử dụng nghịch đảo của cả hai. – Nallath

+0

Cảm ơn, tôi đã làm việc với sự trợ giúp lớn từ câu trả lời ở trên và câu trả lời của bạn. Bây giờ tất cả đều có ý nghĩa rất nhiều. Chúc mừng. –

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