qt窗口中顯示halcon的圖像

先上圖片和代碼

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;

完了效果如圖:

可以看到顯示了兩張圖片,小圖是原來的方式顯示 的,而大圖是用上面這段代碼顯示的,放在一起正好可以看看差別。可以看到大圖的圖像框是隨着圖片伸展的,而且放在了框內,和按鈕混在一起是因爲還沒在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<height;i++)
 {
     for (int j=0;j<width;j++)
     {
         r = *(data+2);
         g = *(data+1);
         b = *data;

         graydata[i*bpl+j*3]  =(r*30+g*59+b*11)/100;
         graydata[i*bpl+j*3+1]=(r*30+g*59+b*11)/100;
         graydata[i*bpl+j*3+2]=(r*30+g*59+b*11)/100;

         data+=4;
     }
 }

  GenImage1Extern(&Image, "byte", (HTuple)width, (HTuple)height, (long)graydata, NULL);

通過一系列研究,瞭解了圖像的存儲方式,並知道了圖像轉換的過程:

首先獲取圖像長寬,計算圖像的字節大小並初始化目標圖像內存空間,然後通過循環每個像素將原圖像數據內容複製進目標圖像內存空間,最後通過調用halcon中的圖像生成函數,將目標圖像指針對應的圖像生成halcon中的類型的圖像。

最後失敗圖像:


最後的解決方法:放棄c++和halcon間的類型轉換,halcol裏的類型用於圖像處理,而圖像在界面上的顯示就用qt的方法。

















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章