def foldDrawer(self,event,x,y,flags,param): if event==cv.CV_EVENT_LBUTTONUP: self.foldline_pts.append((x,y)) print "ADDED PT" cv.Circle(self.background,(x,y),3,cv.CV_RGB(255,0,0),-1) if len(self.foldline_pts) >= 2: self.foldline = Vector2D.make_ln_from_pts(self.foldline_pts[0],self.foldline_pts[1]) ln_start = Vector2D.intercept(self.foldline,Vector2D.horiz_ln(y=0)) ln_end = Vector2D.intercept(self.foldline,Vector2D.horiz_ln(y=self.background.height)) cv.Line(self.background,(int(ln_start[0]),int(ln_start[1])),(int(ln_end[0]),int(ln_end[1])),cv.CV_RGB(0,0,0)) self.has_foldline = True elif len(self.foldline_pts) > 0: self.addTempCVShape(CVLineSegment(cv.CV_RGB(255,255,255),2,Geometry2D.LineSegment(Geometry2D.Point(self.foldline_pts[0][0],self.foldline_pts[0][1]),Geometry2D.Point(x,y))))
def get_folded_model(self,foldLine): #do the fold line # A function Vector2D.intercept doesnt work if x or y of pts are same. Therofre I put some noise if neded noise = -1; difX = (foldLine[0])[0] - (foldLine[1])[0] difY = (foldLine[0])[1] - (foldLine[1])[1] if ((difX == 0) and (difY == 0)): self.foldline_pts.append( ((foldLine[0])[0]+noise,(foldLine[0])[1]+noise) ) elif(difX == 0): self.foldline_pts.append( ((foldLine[0])[0]+noise,(foldLine[0])[1]) ) elif(difY == 0): self.foldline_pts.append( ((foldLine[0])[0],(foldLine[0])[1]+noise) ) else: self.foldline_pts.append(foldLine[0]) self.foldline_pts.append(foldLine[1]) self.foldline = Vector2D.make_ln_from_pts(self.foldline_pts[0],self.foldline_pts[1]) ln_start = Vector2D.intercept(self.foldline,Vector2D.horiz_ln(y=0)) ln_end = Vector2D.intercept(self.foldline,Vector2D.horiz_ln(y=self.background.height)) #visualisation cv.Line(self.background,(int(ln_start[0]),int(ln_start[1])),(int(ln_end[0]),int(ln_end[1])),cv.CV_RGB(0,0,0)) cv.Circle(self.background,self.foldline_pts[0],4,cv.CV_RGB(0,255,0)) cv.Circle(self.background,self.foldline_pts[1],4,cv.CV_RGB(0,255,0)) cv.Circle(self.background,(int(ln_start[0]),int(ln_start[1])),4,cv.CV_RGB(255,0,0)) cv.Circle(self.background,(int(ln_end[0]),int(ln_end[1])),4,cv.CV_RGB(255,0,0)) cv.ShowImage("Fold visualisation",self.background ) cv.WaitKey() cv.DestroyWindow("Fold visualisation") model = Models.Point_Model_Folded(self.initial_model,self.foldline_pts[0],self.foldline_pts[1]) model.draw_to_image(self.background,cv.RGB(255,0,0)) if model.illegal() or model.structural_penalty() >= 1.0: print "Model is illegal!" return None else: return model
def saveModel(self): file = open(self.output_modelpath,'w') displacement = Vector2D.intercept(self.foldline,Vector2D.horiz_ln(y=0))[0] (dx,dy) = Vector2D.line_vector(self.foldline) angle = abs(arctan(dy / dx)) if dx > 0 and dy > 0: angle = angle elif dx < 0 and dy > 0: angle = pi - angle elif dx < 0 and dy < 0: angle = pi + angle else: angle *= -1 model = Models.Point_Model_Folded(self.initial_model,self.foldline_pts[0],self.foldline_pts[1]) model.draw_to_image(self.background,cv.RGB(255,0,0)) if model.illegal() or model.structural_penalty() >= 1.0: print "Model is illegal!" self.clearAll() else: model.set_image(None) pickle.dump(model,file)
def extract_samples(self,nearest_pts,cv_image,contour): [center,b_l,t_l,t_r,b_r] = nearest_pts l_line = Vector2D.make_seg(center,t_l) r_line = Vector2D.make_seg(center,t_r) l_side = Vector2D.make_seg(b_l,t_l) bl_side = Vector2D.make_seg(b_l,center) br_side = Vector2D.make_seg(b_r,center) r_side = Vector2D.make_seg(b_r,t_r) t_side = Vector2D.make_seg(t_l,t_r) l_crop_br = Vector2D.extrapolate_pct(bl_side,0.5) l_crop_bl = Vector2D.intercept(l_side,Vector2D.horiz_ln(l_crop_br[1])) l_crop_tr = Vector2D.intercept(Vector2D.vert_ln(l_crop_br[0]),l_line) l_crop_tl = Vector2D.pt_sum(l_crop_bl,Vector2D.pt_diff(l_crop_tr,l_crop_br)) l_rect = (l_crop_bl,l_crop_br,l_crop_tr,l_crop_tl) r_crop_bl = Vector2D.extrapolate_pct(br_side,0.5) r_crop_br = Vector2D.intercept(r_side,Vector2D.horiz_ln(r_crop_bl[1])) r_crop_tl = Vector2D.intercept(Vector2D.vert_ln(r_crop_bl[0]),r_line) r_crop_tr = Vector2D.pt_sum(r_crop_br,Vector2D.pt_diff(r_crop_tl,r_crop_bl)) r_rect = (r_crop_bl,r_crop_br,r_crop_tr,r_crop_tl) t_crop_bl = Vector2D.extrapolate_pct(l_line,0.5) t_crop_br = Vector2D.intercept(Vector2D.horiz_ln(t_crop_bl[1]),r_line) if t_l[1] > t_r[1]: t_crop_tl = Vector2D.intercept(Vector2D.vert_ln(t_crop_bl[0]),t_side) t_crop_tr = Vector2D.pt_sum(t_crop_br,Vector2D.pt_diff(t_crop_tl,t_crop_bl)) else: t_crop_tr = Vector2D.intercept(Vector2D.vert_ln(t_crop_br[0]),t_side) t_crop_tl = Vector2D.pt_sum(t_crop_bl,Vector2D.pt_diff(t_crop_tr,t_crop_br)) """ t_rect_old = (t_crop_bl,t_crop_br,t_crop_tr,t_crop_tl) (orig_t_width,orig_t_height) = Vector2D.rect_size(t_rect_old) while cv.PointPolygonTest(contour,Vector2D.pt_scale(Vector2D.pt_sum(t_crop_tl,t_crop_tr),0.5),0) < 0: t_crop_tl = (t_crop_tl[0],t_crop_tl[1]+0.05*orig_t_height) t_crop_tr = (t_crop_tr[0],t_crop_tr[1]+0.05*orig_t_height) print "shrinking t_height" """ t_rect = (t_crop_bl,t_crop_br,t_crop_tr,t_crop_tl) (l_width,l_height) = Vector2D.rect_size(l_rect) (r_width,r_height) = Vector2D.rect_size(r_rect) (t_width,t_height) = Vector2D.rect_size(t_rect) #print "Height difference:%f"%(t_height - orig_t_height) width = min(l_width,r_width,t_width) * 0.9 height = min(l_height,r_height,t_height) * 0.9 if width < 5: width = 5 print "Hit min" if height < 5: height = 5 print "Hit min" l_rect_scaled = Vector2D.scale_rect(l_rect,width,height) r_rect_scaled = Vector2D.scale_rect(r_rect,width,height) t_rect_scaled = Vector2D.scale_rect(t_rect,width,height) filenames = ("l_part.png","r_part.png","t_part.png") for i,r in enumerate((l_rect_scaled,r_rect_scaled,t_rect_scaled)): image_temp = cv.CloneImage(cv_image) cv.SetImageROI(image_temp,Vector2D.rect_to_cv(r)) cv.SaveImage("%s/%s"%(self.save_dir,filenames[i]),image_temp) return (l_line,r_line)
def draw_line(img,pt1,pt2): line = Vector2D.make_ln_from_pts(pt1,pt2) ln_start = Vector2D.intercept(line,Vector2D.horiz_ln(y=0)) ln_end = Vector2D.intercept(line,Vector2D.horiz_ln(y=img.height)) cv.Line(img,ln_start,ln_end,cv.CV_RGB(255,0,0),2)
def draw_line(img, pt1, pt2): line = Vector2D.make_ln_from_pts(pt1, pt2) ln_start = Vector2D.intercept(line, Vector2D.horiz_ln(y=0)) ln_end = Vector2D.intercept(line, Vector2D.horiz_ln(y=img.height)) cv.Line(img, ln_start, ln_end, cv.CV_RGB(255, 0, 0), 2)