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%. x
và y
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 tvec
và rvec
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ì?
- Có
solvePnP
xuất bản dịch trong cùng đơn vị như tôi chỉ địnhobjectPoints
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). camMatrix
và distCoefficients
đế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)
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. –