- improved camera calibration
git-svn-id: http://moon:8086/svn/software/trunk/projects/opencv@320 b431acfa-c32f-4a4a-93f1-934dc6c82436
This commit is contained in:
+61
-78
@@ -61,54 +61,56 @@ class FindObjects():
|
|||||||
objects = []
|
objects = []
|
||||||
temp_objects = []
|
temp_objects = []
|
||||||
objectsCandIds = []
|
objectsCandIds = []
|
||||||
while count != -1:
|
|
||||||
family = FindObjects.getFamily([], count, hierachy)
|
if hierachy.any():
|
||||||
|
while count != -1:
|
||||||
dupDict = {}
|
family = FindObjects.getFamily([], count, hierachy)
|
||||||
members = []
|
|
||||||
for member in family:
|
|
||||||
x,y,w,h = cv2.boundingRect(contours[member]);
|
|
||||||
key = str([x,y,w,h]) + '.key'
|
|
||||||
if not key in dupDict:
|
|
||||||
dupDict[key] = member
|
|
||||||
members.append({ 'id' : member, 'bbox' : [x,y,w,h]})
|
|
||||||
|
|
||||||
objectsCandIds.append(members)
|
|
||||||
|
|
||||||
count = hierachy[0][count][0]
|
|
||||||
|
|
||||||
for family in objectsCandIds:
|
dupDict = {}
|
||||||
obj = []
|
members = []
|
||||||
for member in family:
|
for member in family:
|
||||||
area = cv2.contourArea(contours[member['id']])
|
x,y,w,h = cv2.boundingRect(contours[member]);
|
||||||
perimeter = cv2.arcLength(contours[member['id']], True)
|
key = str([x,y,w,h]) + '.key'
|
||||||
pi = 3.14159265359
|
if not key in dupDict:
|
||||||
Q = 0
|
dupDict[key] = member
|
||||||
if (area > 10):
|
members.append({ 'id' : member, 'bbox' : [x,y,w,h]})
|
||||||
Q = 4*pi*area/(perimeter*perimeter)
|
|
||||||
|
objectsCandIds.append(members)
|
||||||
if Q > 0.7:
|
|
||||||
diameter = max(member['bbox'][2], member['bbox'][3])
|
count = hierachy[0][count][0]
|
||||||
self.maxDiameter = max(self.maxDiameter, diameter)
|
|
||||||
self.minDiameter = min(self.minDiameter, diameter)
|
for family in objectsCandIds:
|
||||||
member['diameter'] = diameter
|
obj = []
|
||||||
member['pos'] = (int(member['bbox'][0] + member['bbox'][2]/2), int(member['bbox'][1] + member['bbox'][3]/2))
|
for member in family:
|
||||||
obj.append(member)
|
area = cv2.contourArea(contours[member['id']])
|
||||||
|
perimeter = cv2.arcLength(contours[member['id']], True)
|
||||||
if obj:
|
pi = 3.14159265359
|
||||||
temp_objects.append(obj)
|
Q = 0
|
||||||
|
if (area > 10):
|
||||||
for obj in temp_objects:
|
Q = 4*pi*area/(perimeter*perimeter)
|
||||||
for member in obj:
|
|
||||||
if member['diameter'] < self.innerOuterRatio*self.maxDiameter:
|
if Q > 0.7:
|
||||||
member['isHole'] = True
|
diameter = max(member['bbox'][2], member['bbox'][3])
|
||||||
else:
|
self.maxDiameter = max(self.maxDiameter, diameter)
|
||||||
member['isHole'] = False
|
self.minDiameter = min(self.minDiameter, diameter)
|
||||||
|
member['diameter'] = diameter
|
||||||
if len(obj) == 2:
|
member['pos'] = (int(member['bbox'][0] + member['bbox'][2]/2), int(member['bbox'][1] + member['bbox'][3]/2))
|
||||||
self.meanThickness = int(abs(obj[0]['diameter'] - obj[1]['diameter'])/2)
|
obj.append(member)
|
||||||
|
|
||||||
objects.append({'thickness' : self.meanThickness, 'members' : obj})
|
if obj:
|
||||||
|
temp_objects.append(obj)
|
||||||
|
|
||||||
|
for obj in temp_objects:
|
||||||
|
for member in obj:
|
||||||
|
if member['diameter'] < self.innerOuterRatio*self.maxDiameter:
|
||||||
|
member['isHole'] = True
|
||||||
|
else:
|
||||||
|
member['isHole'] = False
|
||||||
|
|
||||||
|
if len(obj) == 2:
|
||||||
|
self.meanThickness = int(abs(obj[0]['diameter'] - obj[1]['diameter'])/2)
|
||||||
|
|
||||||
|
objects.append({'thickness' : self.meanThickness, 'members' : obj})
|
||||||
|
|
||||||
return objects
|
return objects
|
||||||
|
|
||||||
@@ -126,7 +128,9 @@ ap.add_argument("-r", "--framerate", type=int, default=30,
|
|||||||
ap.add_argument("-f", "--filename", type=str, default='piCamera',
|
ap.add_argument("-f", "--filename", type=str, default='piCamera',
|
||||||
help="Whether or not frames should be displayed")
|
help="Whether or not frames should be displayed")
|
||||||
ap.add_argument("-c", "--calibrate", type=str, default='off',
|
ap.add_argument("-c", "--calibrate", type=str, default='off',
|
||||||
help="Whether or not frames should be displayed")
|
help="Whether calibration shall be performed")
|
||||||
|
ap.add_argument("-u", "--use-calibration", type=str, default='off',
|
||||||
|
help="Whether calibration shall be used")
|
||||||
args = vars(ap.parse_args())
|
args = vars(ap.parse_args())
|
||||||
|
|
||||||
videoFile = args["filename"]
|
videoFile = args["filename"]
|
||||||
@@ -138,7 +142,7 @@ if videoFile == "piCamera":
|
|||||||
from PiVideoStream import PiVideoStream
|
from PiVideoStream import PiVideoStream
|
||||||
from picamera.array import PiRGBArray
|
from picamera.array import PiRGBArray
|
||||||
from picamera import PiCamera
|
from picamera import PiCamera
|
||||||
vs = PiVideoStream(resolution=(2*width,2*height), framerate=framerate).start()
|
vs = PiVideoStream(resolution=(width,height), framerate=framerate).start()
|
||||||
time.sleep(5.0)
|
time.sleep(5.0)
|
||||||
else:
|
else:
|
||||||
vs = cv2.VideoCapture(videoFile)
|
vs = cv2.VideoCapture(videoFile)
|
||||||
@@ -161,54 +165,34 @@ if args["calibrate"] == 'on':
|
|||||||
ret, frame = vs.read()
|
ret, frame = vs.read()
|
||||||
|
|
||||||
Z = np.float32(frame)
|
Z = np.float32(frame)
|
||||||
print (frame.dtype)
|
ref_color = cv2.mean(Z[int(height/2-8):int(height/2+8), int(width/2-8):int(width/2+8), :])
|
||||||
print (frame.shape)
|
|
||||||
print (lens_corr.dtype)
|
|
||||||
print (lens_corr.shape)
|
|
||||||
print (Z.dtype)
|
|
||||||
print (Z.shape)
|
|
||||||
ref_color = Z[height/2, width/2, :]
|
|
||||||
print (ref_color)
|
print (ref_color)
|
||||||
|
|
||||||
for c in range (0, 3):
|
lens_corr = cv2.divide(ref_color, Z)
|
||||||
lens_corr[:,:,c] = cv2.divide(ref_color[c], Z[:,:,c])
|
|
||||||
|
|
||||||
params = list()
|
params = list()
|
||||||
params.append(cv2.IMWRITE_PNG_COMPRESSION)
|
params.append(cv2.IMWRITE_PNG_COMPRESSION)
|
||||||
params.append(0)
|
params.append(0)
|
||||||
|
|
||||||
for c in range (0, 3):
|
cv2.imwrite("lens_corr.png", np.uint8(lens_corr*127.0), params)
|
||||||
lens_corr[:,:,c] = cv2.multiply(128, lens_corr[:,:,c])
|
|
||||||
cv2.imwrite("lens_corr.png", np.uint8(lens_corr), params)
|
|
||||||
|
|
||||||
sys.exit()
|
sys.exit()
|
||||||
|
|
||||||
|
|
||||||
frame = np.ones((height, width, 3), np.float32)
|
frame = np.ones((height, width, 3), np.float32)
|
||||||
lens_corr = np.float32(cv2.imread("lens_corr.png"))
|
lens_corr = np.float32(cv2.imread("lens_corr.png"))/140.0
|
||||||
|
|
||||||
# loop over some frames...this time using the threaded stream
|
# loop over some frames...this time using the threaded stream
|
||||||
while fps._numFrames < args["num_frames"]:
|
while fps._numFrames < args["num_frames"]:
|
||||||
# grab the frame from the threaded video stream
|
# grab the frame from the threaded video stream
|
||||||
|
|
||||||
if videoFile == "piCamera":
|
if videoFile == "piCamera":
|
||||||
frame8 = vs.read()[int(height/2):int(height/2+height), int(width/2):int(width/2)+width]
|
frame = vs.read()
|
||||||
else:
|
else:
|
||||||
ret, frame8 = vs.read()
|
ret, frame = vs.read()
|
||||||
|
|
||||||
if 0:
|
if args["use_calibration"] == 'on':
|
||||||
frame32 = np.float32(frame8)
|
frame = np.uint8(cv2.multiply(lens_corr, np.float32(frame)))
|
||||||
print (frame.dtype)
|
|
||||||
print (frame.shape)
|
|
||||||
print (lens_corr.dtype)
|
|
||||||
print (lens_corr.shape)
|
|
||||||
|
|
||||||
for c in range (0, 3):
|
|
||||||
frame32[:,:,c] = cv2.multiply(lens_corr[:,:,c], frame32[:,:,c], 1.0/255)
|
|
||||||
|
|
||||||
frame = np.uint8(frame32)
|
|
||||||
else:
|
|
||||||
frame = frame8
|
|
||||||
|
|
||||||
kernel = np.ones((3,3),np.uint8)
|
kernel = np.ones((3,3),np.uint8)
|
||||||
frame_dilated = cv2.dilate(frame,kernel,iterations = 1)
|
frame_dilated = cv2.dilate(frame,kernel,iterations = 1)
|
||||||
@@ -284,7 +268,6 @@ while fps._numFrames < args["num_frames"]:
|
|||||||
print("Found " + str(numColorClasses) + " color classes")
|
print("Found " + str(numColorClasses) + " color classes")
|
||||||
|
|
||||||
|
|
||||||
cv2.imshow('Raw',frame8)
|
|
||||||
cv2.imshow('Corrected', frame)
|
cv2.imshow('Corrected', frame)
|
||||||
cv2.imshow('Contours', frame_dilated)
|
cv2.imshow('Contours', frame_dilated)
|
||||||
cv2.imshow('Colors', img1_colors)
|
cv2.imshow('Colors', img1_colors)
|
||||||
|
|||||||
Reference in New Issue
Block a user