inpainting小工具的debug过程

来源:互联网 发布:淘宝开店客服怎么弄 编辑:程序博客网 时间:2024/06/06 08:01

实现想要的功能是一回事,调试过程中想到新的功能,遇到新的exception,等等,我都把它们放在这里总结一下吧

1. 如果 图像显示块在没有添加图像时默认显示一些文字,应该可读性更强吧,所以textitem可以实现默认文字的显示

    QGraphicsTextItem* background_image=new QGraphicsTextItem;
    background_image->setPlainText("Original Image Space");
    originalScene->addItem(background_image);
    ui->originalView->show();
2. 最开始编程的时候其实就应该考虑之后的移植问题,但我经验不足,最开始的程序中读写文件的位置都指定在了电脑的其他位置,换个电脑就找不到读写位置了,所以

    dir_base=QDir::currentPath();
    dir_imagedatabase=dir_base+"\\inpainting\\image_database\\";
    dir_maskdatabase=dir_base+"\\inpainting\\mask_database\\";
    dir_result=dir_base+"\\inpainting\\result\\";
QDir::currentPath()可以获得当前exe文件所在的地址,以此为基准存放读文件,和确定写文件的位置

3. 文件的命名是另一个没有实现考虑的问题,我按照默认的文件命名格式,数出文件名本身的位置,截取string的对应位数的方法获取单纯文件名;但是如果程序打开了不符合命名规律的文件,则出现错误,所以

    file=QFileInfo(filename);
    string final_name_proposed=dir_result.toStdString()+(file.baseName()).toStdString()+"_inpainted.jpg";
dir_result为前面提到的路径,QFileInfo中的baseName函数可以直接得到单纯的文件名

4. 组件属性中更多有用选项,palette可以设置背景颜色,font可以改变字体格式,windowTitle则修改窗口标题显示的内容等

5. 在操作过程中还出现了明明在视图窗中修改了布局样式,但运行中却没有改变。原因是mianwindow.ui文件编译都对应的ui_mainwindow.h应该只存在编译执行生成的文件夹中,而不存在于其他.cpp文件所在的工程目录中,但当时我的情况是ui_mainwindow.h有两个,一个在工程目录中,一个在执行目录中,工程目录中的文件始终不变,对应的结果也不变。直接将工程目录中的文件用最新的问题替换可以解决问题,但问题是它根本不应该存在啊,直接删除又会出现dependence错误,反复clear,rebuild,qmake,关掉重开,几次重复之后解决问题。

注意正常情况是ui_mainwindow.h不应该存在于工程目录中,它是程序自动生成并不断更新的。

6. 图像区打开一次超大图像后,clear,update之后虽然显示区是空的,但是scene的大小状态仍保持原状,之后打开小文件时仍那么大,会出现不匹配的问题

originalScene->clear();
ui->originalView->update();
所以,应该更彻底的毁掉已经生成的scene,重新生成新的scene

        delete originalScene;
        originalScene =new QGraphicsScene(this);
        ui->originalView->setScene(originalScene);
        ui->originalView->update();
当然delete之前要先判断是否真的有这个东西

7. 鼠标运动那块问题更多,包括鼠标是不是跑出了图像区域,鼠标是不是在外面点了然后拖进区域释放的等等,要求在相应的函数中比较鼠标位置与图像信息关系,并适当的赋值参量,比如鼠标中间跑到了外面的区域,则相当于从边界开始,等等。

    if(this->x<0){
        this->x=0;
    }
    if(this->y<0){
        this->y=0;
    }
    if(this->x > this->scene()->width()){
        this->x = this->scene()->width();
    }
    if(this->y > this->scene()->height()){
        this->y = this->scene()->height();
    }

if((ui->resultView_proposed_user->line_x<0||ui->resultView_proposed_user->line_y<0||(ui->resultView_proposed_user->line_x > pix_user->width())||(ui->resultView_proposed_user->line_y > pix_user->height())))
    {
        QMessageBox::information(this,"error","mask out of range");
      }

8. 最开始只考虑了生成一个inpaint动作的情况,之后补充了在inpainted基础上再inpaint的情况,需要补充的代码就是在点inpaint按钮时,img不调用最开始的img而是直接采用现有的img,这样则要求新图像打开时,相关的MAT都要清除并重新复制。同样显示步骤时这些中间步骤也要记录。需要想清楚那个MAT需要在哪里清除,重新赋值,等等,我这人脑子容易乱,中间乱了好多次

if((ui->resultView_proposed_user->line_x<0||ui->resultView_proposed_user->line_y<0||(ui->resultView_proposed_user->line_x > pix_user->width())||(ui->resultView_proposed_user->line_y > pix_user->height())))
    {
        QMessageBox::information(this,"error","mask out of range");
        on_commandLinkButton_5_clicked();
    }

9. 还有就是直接按inpaint可以在之前结果的基础上继续inpaint,那么也需要重新开始inpaint的过程,所以新添了reset inpaint过程的按钮。其他还有显示步骤时提示显示到最后一步的消息框。

10. 其他的大大小小不记得了,总结起来就是脑子不能乱,改或加东西都要一步一步来,起名字一定要写清楚给自己留后路。

11. 目前应该差不多了,遗憾就是界面没有做的更炫,与其他算法的比较要不要加,然后类似标签的点那个按钮显示哪个结果的功能一直在纠结要不要加,还有就是在图像显示区域的鼠标滑动控制放大缩小的功能,实现起来好像也有困难。

时间已经过去一周多了,还有其他的东西要准备,现在就放在这样吧。也许以后会有一天重新完善它吧,就像暑假的时候我第一次做这个东西,完全没有目的,却变成了为这次的demo打下了很好的基础~~

不管怎样,第一次做了个图像界面出来,很粗糙的小软件,360还老说它是病毒(我要是会编病毒该牛气起来了),心情不错~~

明天就是大周末,实验室集体出游,但愿玩的愉快~~over~~

0 0
原创粉丝点击