def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) #界面部分 self.setWindowTitle('FittingLine Tool') #基础数据部分 self.set_base_data() #Item 部分设置 self.set_item() #结果数据部分 self.output_result() #连接信号与槽 # 数据部分 self.state = State.Idle.value # self.rect= myRect(myPoint(40,40),10,20,myPoint(1,0)) self.src_img = None self.line = myLine(myPoint(50, 50), myPoint(150, 150)) self.line_item = FindLineItem(self.line) self.operator = FittingLineOperator() self.line_item.setZValue(100) self.points_item = None self.file_name = None self.rects = list() self.connect_UI()
def __init__(self,point1,point2,point3): line12=myLine(point1,point2) line23=myLine(point2,point3) if line12.is_parallel_to(line23): print('3 points in one line') return mid_point12 = (point1 + point2) * 0.5 mid_point23 = (point2 + point3) * 0.5 gradient12 = (point2.y - point1.y) / (point2.x - point1.x) gradient23 = (point3.y - point2.y) / (point3.x - point2.x) gradient1=-1/gradient12 gradient2=-1/gradient23 denominator=gradient2-gradient1 nominator=mid_point12.y-(gradient1*mid_point12.x)+(gradient2*mid_point23.x)-mid_point23.y center_x=nominator/denominator center_y=gradient1*(center_x-mid_point12.x)+mid_point12.y self.center=myPoint(center_x,center_y) self.radius=self.center.distance_to(point1) self.area = self.radius* self.radius * math.pi self.circumference = 2 * self.radius * math.pi
def Ransac(self): iter = 0 while iter < self.iter: chose_index1 = numpy.random.randint(0, len(self.points)) chose_index2 = numpy.random.randint(0, len(self.points)) self.temp_line = myLine(self.points[chose_index1], self.points[chose_index2]) self.temp_ok_points.clear() self.temp_ng_points.clear() self.temp_dist = 0 for j in range(len(self.points)): dist = self.temp_line.to_point(self.points[j]) self.temp_dist = dist + self.temp_dist if dist < self.thresh: self.temp_ok_points.append(self.points[j]) else: self.temp_ng_points.append(self.points[j]) if len(self.temp_ok_points) == len(self.ok_points): if self.temp_dist < self.dist: self.dist = self.temp_dist print(self.dist) self.ok_points.clear() self.ng_points.clear() self.line = self.temp_line self.ok_points = self.temp_ok_points.copy() self.ng_points = self.temp_ng_points.copy() if len(self.temp_ok_points) > len(self.ok_points): #self.k=math.log(0.0001)/math.log(1-pow(len(self.ok_points)/len(self.points),2)) self.ok_points.clear() self.ng_points.clear() self.line = self.temp_line self.ok_points = self.temp_ok_points.copy() self.ng_points = self.temp_ng_points.copy() #if self.i<self.k: # break if len(self.ng_points) < self.delete_count: temp_count = self.delete_count - len(self.ng_points) #self.Delete_Points(self.ok_points,self.ng_points,temp_count) iter += 1 print('dist:', self.temp_dist) #print(len(self.ok_points)) if len(self.ok_points) > self.min_count: #if self.delete_count>len(self.ng_points): self.Delete_Points(self.ok_points, self.ng_points, self.delete_count) return self.ok_points, self.ng_points, self.line else: print('not enough points')
x_ration = self.view.viewport().width() / scene_rect.width() y_ration = self.view.viewport().height() / scene_rect.height() if x_ration < y_ration: y_ration = x_ration trans.scale(y_ration, y_ration) self.view.reset_view() self.view.setTransform(trans) if __name__ == '__main__': app = QApplication(sys.argv) #window=ViewWidget() #window.show() point1 = myPoint(40, 50) width = 50 height = 30 dir = myPoint(3, 4) rect = myRect(point1, width, height, dir) circle = myCircle(myPoint(50, 50), 20) line = myLine(myPoint(50, 50), myPoint(146, 50)) rect_item = RectItem(rect) #RectItem(rect) circle_item = FindCircleItem(circle) view_widget = ViewWidget() img = QImage("../image/cv_team.jpg") view_widget.set_image(img) view_widget.add_item(rect_item) view_widget.add_item(circle_item) view_widget.show() view_widget.resize(800, 600) #window.showMaximized() app.exec()