From 48674e65f3068d6ec1a5602072538ac39905b37d Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Tue, 20 Sep 2016 17:17:37 +0000 Subject: [PATCH] - improved camera calibration git-svn-id: http://moon:8086/svn/software/trunk/projects/opencv@320 b431acfa-c32f-4a4a-93f1-934dc6c82436 --- beadDetect.py | 139 ++++++++++++++++++++++---------------------------- 1 file changed, 61 insertions(+), 78 deletions(-) diff --git a/beadDetect.py b/beadDetect.py index 77de481..3882316 100755 --- a/beadDetect.py +++ b/beadDetect.py @@ -61,54 +61,56 @@ class FindObjects(): objects = [] temp_objects = [] objectsCandIds = [] - while count != -1: - family = FindObjects.getFamily([], count, hierachy) - - dupDict = {} - 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] + + if hierachy.any(): + while count != -1: + family = FindObjects.getFamily([], count, hierachy) - for family in objectsCandIds: - obj = [] - for member in family: - area = cv2.contourArea(contours[member['id']]) - perimeter = cv2.arcLength(contours[member['id']], True) - pi = 3.14159265359 - Q = 0 - if (area > 10): - Q = 4*pi*area/(perimeter*perimeter) - - if Q > 0.7: - diameter = max(member['bbox'][2], member['bbox'][3]) - self.maxDiameter = max(self.maxDiameter, diameter) - self.minDiameter = min(self.minDiameter, diameter) - member['diameter'] = diameter - member['pos'] = (int(member['bbox'][0] + member['bbox'][2]/2), int(member['bbox'][1] + member['bbox'][3]/2)) - obj.append(member) - - 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}) + dupDict = {} + 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: + obj = [] + for member in family: + area = cv2.contourArea(contours[member['id']]) + perimeter = cv2.arcLength(contours[member['id']], True) + pi = 3.14159265359 + Q = 0 + if (area > 10): + Q = 4*pi*area/(perimeter*perimeter) + + if Q > 0.7: + diameter = max(member['bbox'][2], member['bbox'][3]) + self.maxDiameter = max(self.maxDiameter, diameter) + self.minDiameter = min(self.minDiameter, diameter) + member['diameter'] = diameter + member['pos'] = (int(member['bbox'][0] + member['bbox'][2]/2), int(member['bbox'][1] + member['bbox'][3]/2)) + obj.append(member) + + 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 @@ -126,7 +128,9 @@ ap.add_argument("-r", "--framerate", type=int, default=30, ap.add_argument("-f", "--filename", type=str, default='piCamera', help="Whether or not frames should be displayed") 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()) videoFile = args["filename"] @@ -138,7 +142,7 @@ if videoFile == "piCamera": from PiVideoStream import PiVideoStream from picamera.array import PiRGBArray 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) else: vs = cv2.VideoCapture(videoFile) @@ -161,54 +165,34 @@ if args["calibrate"] == 'on': ret, frame = vs.read() Z = np.float32(frame) - print (frame.dtype) - print (frame.shape) - print (lens_corr.dtype) - print (lens_corr.shape) - print (Z.dtype) - print (Z.shape) - ref_color = Z[height/2, width/2, :] + ref_color = cv2.mean(Z[int(height/2-8):int(height/2+8), int(width/2-8):int(width/2+8), :]) print (ref_color) - for c in range (0, 3): - lens_corr[:,:,c] = cv2.divide(ref_color[c], Z[:,:,c]) + lens_corr = cv2.divide(ref_color, Z) params = list() params.append(cv2.IMWRITE_PNG_COMPRESSION) params.append(0) - for c in range (0, 3): - lens_corr[:,:,c] = cv2.multiply(128, lens_corr[:,:,c]) - cv2.imwrite("lens_corr.png", np.uint8(lens_corr), params) + cv2.imwrite("lens_corr.png", np.uint8(lens_corr*127.0), params) sys.exit() 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 while fps._numFrames < args["num_frames"]: # grab the frame from the threaded video stream if videoFile == "piCamera": - frame8 = vs.read()[int(height/2):int(height/2+height), int(width/2):int(width/2)+width] + frame = vs.read() else: - ret, frame8 = vs.read() + ret, frame = vs.read() - if 0: - frame32 = np.float32(frame8) - 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 + if args["use_calibration"] == 'on': + frame = np.uint8(cv2.multiply(lens_corr, np.float32(frame))) kernel = np.ones((3,3),np.uint8) frame_dilated = cv2.dilate(frame,kernel,iterations = 1) @@ -284,7 +268,6 @@ while fps._numFrames < args["num_frames"]: print("Found " + str(numColorClasses) + " color classes") - cv2.imshow('Raw',frame8) cv2.imshow('Corrected', frame) cv2.imshow('Contours', frame_dilated) cv2.imshow('Colors', img1_colors)