I am trying to write a program with aruco+openCV. Program detects two ArUco markers, invert the second one and compose them together. Result is another tvec and rvec. I am summing tvec and first markers tvec, multiplying rvec and first markers rvec. And trying to show that with projectPoints and cv.imshow. My tvec/rvec invert operation code:
def inversePerspective(rvec, tvec):
R, _ = cv2.Rodrigues(rvec)
R = np.matrix(R).T
invTvec = np.dot(-R, np.matrix(tvec))
invRvec, _ = cv2.Rodrigues(R)
return invRvec, invTvec
In another question user Tetragramm helped me to understand the basics. You can find the question in: http://answers.opencv.org/question/175705/mapping-aruco-markers/
And I thought I should test my functions. In relative position function:
def relativePosition(rvec1, tvec1, rvec2, tvec2):
rvec1, tvec1 = rvec1.reshape((3, 1)), tvec1.reshape((3, 1))
rvec2, tvec2 = rvec2.reshape((3, 1)), tvec2.reshape((3, 1))
# Inverse the second marker, the right one in the image
invRvec, invTvec = inversePerspective(rvec2, tvec2)
print(invRvec, invTvec, "\n and \n", inversePerspective(invRvec, invTvec))
info = cv2.composeRT(rvec1, tvec1, invRvec, invTvec)
composedRvec, composedTvec = info[0], info[1]
composedRvec = composedRvec.reshape((3, 1))
composedTvec = composedTvec.reshape((3, 1))
return composedRvec, composedTvec
I executed code once and showed 2 markers that near to each other. Normally I should expect that in print function, it should print almost the same matrices. The output was:
[[0.03154277]
[0.09233561]
[1.50092897]] [[ 0.0208505 ]
[ 0.05647337]
[-0.00029105]]
and
(array([[-0.03154277],
[-0.09233561],
[-1.50092897]]), matrix([[-0.05770734],
[ 0.01679542],
[-0.00344181]]))
Obviously they are different. Is there anything I did wrong ? My current code is in github and I really accept any kind of help. I am searching for days and days. Thanks in advance for the answers, here is the codebase: https://github.com/aliyasineser/GraduationProjectII/blob/master/aruco_tracker.py