inpainting小工具的完善(2)-- 随意选区,页面布局

来源:互联网 发布:营销数据分析 pdf 编辑:程序博客网 时间:2024/06/06 00:57

前篇文章介绍了检测鼠标动作以及简单图形选区,接下来我实现了画笔功能,并将画笔经过的区域制作为bmp文件,用作inpainting的mask。

1.最开始我想跟据之前的qgraphicsEllipseItem等,选用qgraohicspathitem,但实际标明,pathitem选出的是区域,扇形之类的,并不是字面上的path线。

2.所以改用line,通过addLine 函数实现画笔功能,具体在qgraphicsscene上显示的实现函数为

        resultScene_proposed_user->addLine(previous_x,previous_y,ui->resultView_proposed_user->line_x,ui->resultView_proposed_user->line_y,pen);
该函数需要两点定义直线,previous_x,previous_y的初始值为点下鼠标的位置,之后根据鼠标按下运动时经过的点坐标不断更新。

注意要先画线,后更新previous_x,y,否则化出来的不是线而是一个个独立的点

相对应的在实现图像mat上修改值得方法为

        cv::line(mask_image,Point(previous_x,previous_y),Point(ui->resultView_proposed_user->line_x,ui->resultView_proposed_user->line_y),Scalar(255,255,255),ui->pensize->value(),8,0);

3. addline函数中使用的pen是类型为QPen的对象,由界面上QSpinBox组件选择的数值定义pen的粗细,同时粗细值也要用在cv::line函数中,保持选择区域的一致

4. 因为画笔要一边话一边显示结果,所以show函数与方形圆形区域不同,不是在鼠标释放的时候显示,而是鼠标移动的过程中不断调用


页面布局,因为我一开始完全没有想到用生成的窗口的最大最小化功能,后经同学提醒,才开始试验,发现我之前的布局下,点最大框,窗口是变大了,但里面的部件位置相对不动,结果相当奇怪,查了一些资料,发现实践起来还是有问题,而且又不想用代码实现,所以,弄了一段时间,总结一下,不知道能不能说清楚。

1. 首先,必须在不选择任何组件时按鼠标右键->layout->**,这样才能让组件与整个窗口同放大缩小,根据想要的形式的不同,可以选择不同的layout方式

2.但不得不说,我之前手动布好的局在layout一下后完全走样,因为全局layout按照自己的想法限制了各组件的位置,大小,以及整体的样式,用户可以移动各部件,但仅限于系统指定的几个位置之间换,牵一发而动全身,相当混乱,如果一开始在没有放入任何组件的情况下先安排全局应该会好一些吧,不过我没有试验,只能说说我这种已经布好局,懒得重新换的情况吧。

3. 我的第一个页面如下,组件没有很多,但直接鼠标右键->layout->layout in a grid时,最开始出现的情况是左边两个图像区大小始终不一样,而且没办法像之前一下随意拉动控制大小。中间4个小框框一直挤在一起,间距也一直不合适。

我首先将左边两个调成一样的大小,然后选择鼠标右键->layout->layout vertically in splitter,这样这两个就成了一个整体,可以保证相对大小的稳定。

这里layout vertically in splitter与单纯的layout vertically区别在于,前者可以通过QSplitter的handleWidth来控制相结合的组件之间的距离。

然后 将中间的4个框框排好夹在两个大图形区之间,选择鼠标右键->layout->layout in a grid,则可以完成基本的布局,中间4个框框的间距可能不很满意,则可以用鼠标拖动,上下调节,调节时会出现红色框框,只能移动到红色框框内


4. 我的第二个界面如下,比第一个多出了一些按钮,但思路类似,单独的组件太多,自动安排出来的布局越扯,最好的方法就是讲一些决不能拆开的组件合并。

下面的例子里,我将第一排中间,mask种类的选择checkbox和说明文字等等组成了一个整体,右上方的mask形成和重置按钮成了一个整体,然后上方的三个部分组成一个大整体,然后在鼠标右键->layout->layout in a grid,调整中间竖列的间距和位置,等等

5. 这其中还需要注意的是要想各组件随窗口一起变大还需要保证该组件的 sizepolicy为expanding

maximumsize和minimunsize可以限制变大变小的范围,我在调试的时候不停的换着这些size, 有时管用有时不管用,有时变来变去,所以调试的时候看情况吧


0 0
原创粉丝点击