qt窗口中显示halcon的图像

先上图片和代码

qt窗口中显示halcon的图像_第1张图片

void PreTreat::on_OpenImageButton_clicked()
{
    QString fileName = QFileDialog::getOpenFileName(this,tr("open image file"), "./", tr("Image files(*.jpg *.png);;All files (*.*)"));
                                                        //窗口文字               默认目录       筛选后缀
    widid=this->winId();
    widid2=widid;
    ReadImage(&ho_Image, HTuple(fileName.toStdString().c_str()));
  //  OpenWindow(ui->graphicsView->x(),ui->graphicsView->y(),ui->graphicsView->width(),ui->graphicsView->height(),widid2,"","",&hv_WindowHandle);
    OpenWindow(0,0,ui->graphicsView->width(),ui->graphicsView->height(),widid2,"","",&hv_WindowHandle);
    HDevWindowStack::Push(hv_WindowHandle);
    if(HDevWindowStack::IsOpen())
    {
        DispObj(ho_Image,HDevWindowStack::GetActive());
        globalMark=1;
    }
}

这段函数是对“打开图片”这个按钮的响应,效果就是出现一个窗口可以选择图片文件然后显示在这个窗口上。

widid2是获取了当前窗口的id并在openwindow这个函数里作为第五个参数,效果是可以使图片显示在当前窗口中,而不是打开一个新的窗口来显示。

在这个窗口的中有个qtui里面的部件graphicsView是一个用来显示图像的图像框部件,在openwindow函数中使用了从这个部件获取的参数ui->graphicsView->x(),ui->graphicsView->y(),ui->graphicsView->width(),ui->graphicsView->height()分别是图像框的位置和尺寸,本来目的是为了让图像显示在图像框中,但是效果却如上图所示,图片为了变成图像框的大小而被压缩变形,而且图片也没有如预期那样嵌入在框中,看着十分难受。最重要的是,这样也失去了使用graphicsView的意义,最理想的方式是能让graphicsView适应图片大小,在窗口中合理的显示出来,而不是图片去适应框的大小,因为图片有各种尺寸,而框的大小却是定好了的。

然后是想着从graphicsView来解决问题,上网搜索graphicsView的用法。。。找到这篇文章

Qt 在GraphicsView中 打开一幅图片

套用了这段代码:

    this->image = new QImage();
    if(image->load(fileName))
            {
                QGraphicsScene *scene = new QGraphicsScene;
                scene->addPixmap(QPixmap::fromImage(*image));
                ui->graphicsView->setScene(scene);
                ui->graphicsView->resize(image->width() + 10, image->height() + 10);
                ui->graphicsView->show();
            }
头文件里还有个定义
private:
    Ui::MainWindow *ui;
    QImage *image;

完了效果如图:

qt窗口中显示halcon的图像_第2张图片

可以看到显示了两张图片,小图是原来的方式显示 的,而大图是用上面这段代码显示的,放在一起正好可以看看差别。可以看到大图的图像框是随着图片伸展的,而且放在了框内,和按钮混在一起是因为还没在ui中做好布局,不过问题不大。

现在的问题是:怎样把处理过的图像再显示回窗口?

原来用halcon直接导出的代码中,关于图像的处理,无论是图片、图片尺寸、显示图片、对图片进行处理都是对

 ho_Image进行处理,其类型是这样:

HObject ho_Image;

而用graphicsView显示图片,图片参数是这样:

QImage *image;

所以怎么实现将这两种类型互相转换呢?

下面是对C++转halcon格式的尝试(失败于没能高清halcon图像存储方式):

HObject Image;

int bpl=image->bytesPerLine();
int bc=image->byteCount();
int id=image->depth();
char ft=image->format();

//c++转halcon,有格式问题
unsigned char *data=image->bits();//获取图像像素字节数据的首地址
unsigned char*graydata;//灰度图向内存指针
graydata=new unsigned char[bpl*height];//存储处理后的数据

  unsigned char r,g,b;
  for (int i=0;i

通过一系列研究,了解了图像的存储方式,并知道了图像转换的过程:

首先获取图像长宽,计算图像的字节大小并初始化目标图像内存空间,然后通过循环每个像素将原图像数据内容复制进目标图像内存空间,最后通过调用halcon中的图像生成函数,将目标图像指针对应的图像生成halcon中的类型的图像。

最后失败图像:

qt窗口中显示halcon的图像_第3张图片


最后的解决方法:放弃c++和halcon间的类型转换,halcol里的类型用于图像处理,而图像在界面上的显示就用qt的方法。

















你可能感兴趣的:(学习总结)