Ejemplo n.º 1
0
 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
Ejemplo n.º 3
0
 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)
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
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)