1 | initial version |
cv::threshold (maybe Otzu), cv::erode/dilate, findContours, cv::moments to check which contours are your circles, solvePNP to get the pose. But as always, an image of your marker could help.
2 | No.2 Revision |
cv::threshold (maybe Otzu), cv::erode/dilate, findContours, cv::moments to check which contours are your circles, solvePNP to get the pose. But as always, an image of your marker could help.
Something to begin with: (I just have to practive my python)
#!/usr/bin/env python
import cv2
im_col = cv2.imread('in.jpg',cv2.IMREAD_COLOR)
im = cv2.cvtColor(im_col,cv2.COLOR_BGR2GRAY)
(threshold,bw) = cv2.threshold(im,150,255,cv2.THRESH_BINARY)
#(threshold,bw) = cv2.threshold(im,150,255,cv2.THRESH_OTSU)
conts, hier = cv2.findContours(bw,cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
cleaned = []
for c in conts:
a = cv2.contourArea(c)
print a
if a < 50 and a > 5:
cleaned.append(c)
cv2.drawContours(im_col,cleaned,-1,(0,255,0), 3)
cv2.namedWindow("res")
cv2.imshow("res",im_col)
cv2.waitKey()
Otsu will generate many false positives so that you will have to clean up with Ransac or something similar, THRES_BINARY depends stronger on the threshold so that it's not really robust.