中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

QT中怎么對Mat類進行操作

發布時間:2022-06-09 10:03:53 來源:億速云 閱讀:219 作者:zzz 欄目:開發技術

本篇內容主要講解“QT中怎么對Mat類進行操作”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“QT中怎么對Mat類進行操作”吧!

一、類型轉換

opencv在QT中的應用通常會涉及到這三者的轉換,即MatQImageQPixmap
下面分別給出了

  • Mat轉QImage

  • QImage轉Mat

  • Mat轉QPixmap

1??:Mat轉QImage

QImage MainWindow::MatToImage(const Mat &m)  //Mat轉Image
{
    switch(m.type())
    {
        case CV_8UC1:
        {
            QImage img((uchar *)m.data,m.cols,m.rows,m.cols * 1, QImage::Format_Grayscale8);
            return img;
        }
            break;
        case CV_8UC3:
        {
            QImage img((uchar *)m.data,m.cols,m.rows,m.cols * 3, QImage::Format_RGB888);
            return img.rgbSwapped();  //因為在QT中彩色圖象是RGB的順序,但是在OPENCV中是BGR的順序,所以要轉一下
        }
            break;
        case CV_8UC4:
        {
            QImage img((uchar *)m.data,m.cols,m.rows,m.cols * 4, QImage::Format_ARGB32);
            return img;
        }
            break;
        default:     //如果是默認的,那么將其返回為一個空對象
        {
            QImage img;
            return img;
        }
    }
}

2??:QImage轉Mat

Mat MainWindow::ImageToMat(const QImage &img,bool inCloneImageData)  //Image轉Mat
{
    switch(img.format())
    {
        case QImage::Format_Indexed8:   //單通道
        {
            Mat  mat( img.height(), img.width(), CV_8UC1,
                          const_cast<uchar*>(img.bits()), static_cast<size_t>(img.bytesPerLine()) );

            return (inCloneImageData ? mat.clone() : mat);
        }
        // 8-bit, 3 通道
        case QImage::Format_RGB32:   //這種寫法表示并列關系
        case QImage::Format_RGB888:
        {
            if ( !inCloneImageData )
            {
                qWarning() << "CVS::QImageToCvMat() - Conversion requires cloning because we use a temporary QImage";
            }

            QImage  swapped = img;

            if ( img.format() == QImage::Format_RGB32 )
            {
                swapped = swapped.convertToFormat( QImage::Format_RGB888 );
            }

            swapped = swapped.rgbSwapped();  //因為在QT中彩色圖象是RGB的順序,但是在OPENCV中是BGR的順序,所以要轉一下

            return Mat( swapped.height(), swapped.width(), CV_8UC3,
                        const_cast<uchar*>(swapped.bits()), static_cast<size_t>(swapped.bytesPerLine()) ).clone();
        }
        // 8-bit, 4 channel
        case QImage::Format_ARGB32:
        case QImage::Format_ARGB32_Premultiplied:
        {
            Mat  mat( img.height(), img.width(), CV_8UC4,
                          const_cast<uchar*>(img.bits()), static_cast<size_t>(img.bytesPerLine()) );

            return (inCloneImageData ? mat.clone() : mat);
        }

        // 8-bit, 1 channel
        default:
            qWarning() << "CVS::QImageToCvMat() - QImage format not handled in switch:" << img.format();
            break;
        }
    return Mat();
}

3??:Mat轉QPixmap

QPixmap MainWindow::MatToPixmap(const Mat &m)
{
    return QPixmap::fromImage(MatToImage(m));   //相當于先將Mat轉成Image,再轉成Pixmap
}

二、保存至數據庫

我這里是直接將Mat類型的數據以二進制數據流的方式保存到數據庫中,有些文章是將文件名及其所在的路徑保存到數據庫中,這個還是要好看項目需求,個人而言,我這個要更復雜一點。
演示效果如下:

1??:基礎界面

QT中怎么對Mat類進行操作

2??:磨皮處理

QT中怎么對Mat類進行操作

3??:數據庫中的數據

QT中怎么對Mat類進行操作

4??:核心代碼

注意: 創建數據表的時候,字段的類型,一定要滿足數據的大小,比方說保存圖片一般使用blob相關的類型,其中blob最大為64k,mediumblob最大為16M。

思路,先捕獲ui控件(我用于顯示圖片的控件是QLabel)中的數據,然后進行數據庫操作。具體步驟如下:

數據類型:Image &mdash;>Mat。

然后再將Mat類型保存到byte數組中,再上傳到數據庫。(此時有小伙伴可能就要問了,為什么不直接從Image類型轉byte數組呢?當然可以,不過我們饒了個彎子也是想讓大家學會如何將Mat類型轉成byte數組)

上傳數據庫,用戶名+圖片數據(這個看自身的需求)

準備數據庫查詢語句query,用法如下圖所示

QT中怎么對Mat類進行操作

驗證階段,取回圖片,然后顯示在右側的QLabel中,因為我代碼中取回的是用戶id為33的圖片數據,所以顯示的是一個水瓶。

QT中怎么對Mat類進行操作

void MainWindow::Upmysql()   //將處理的圖片上傳至數據庫
{
    QImage pix=ui->Process_image->pixmap()->toImage();
    Mat m=ImageToMat(pix);  //QImage--->Mat格式轉換
    int height = pix.height();   //定義這兩者的目的是為了傳給Mat的構造函數
    int width = pix.width();
    int iSize = m.total() * m.elemSize();   //記錄Mat圖像的大小,以便于創建同等大小的字節數組
    unsigned char* bytes = new unsigned char[iSize];   //創建一個字節數組,用于保存二進制數據
    memcpy(bytes, m.data, iSize * sizeof(unsigned char));    //將Mat類型的數據賦給byte數組
    //qDebug()<<QByteArray((char*)bytes, 100);    //查看前100個字符
    QByteArray sbuf = QByteArray::fromRawData((char *)bytes, iSize * sizeof(unsigned char));   //將unsigned char轉為QByteArray類型

    QVariant var(sbuf);   //將QByteArray類型轉成QVariant以便于插入到MYSql
    QSqlQuery query;   //下面為數據庫查詢的一種方式,要特別注意格式的要求
    //創建數據表的時候,一定要注意數據的大小,比方說圖片blob為64k,mediumblob為16m
    query.prepare("INSERT INTO Image_All (id, img_data) "
                        "VALUES (:id, :img_data)");
    query.bindValue(":id", 77877);    //我這里隨便設的
    query.bindValue(":img_data",var);
    if(query.exec())
    {
        qDebug()<<"圖片成功上傳至數據庫";
    }
    else{
        qDebug()<<"圖片上傳數據庫失敗";
    }

    QString sql1=QString("select img_data from Image_All where id='33'");   //獲取數據庫中圖片數據
    if(query.exec(sql1)) //執行sql語句是否成功
    {
        while(query.next())//指向下一條
        {
            //根據下標將返回結果進行分割
            QByteArray TEXT1=query.value(0).toByteArray();  //將查詢結果以QByteArray形式返回
            unsigned char *data2;
             data2 = reinterpret_cast<unsigned char*>(TEXT1.data());   //將QByteArray類型轉為unsigned char
            Mat image=Mat(height,width,CV_8UC3,data2);      //將unsigned char轉成Mat類型的數據
            QPixmap temp = MatToPixmap(image);
            ui->Process_image->setPixmap(temp);
        }

    }else
    {
        qDebug()<<"從數據庫獲取圖片失敗";
    }

}

到此,相信大家對“QT中怎么對Mat類進行操作”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

利辛县| 上犹县| 扎囊县| 阿城市| 九龙坡区| 罗平县| 永善县| 自贡市| 襄樊市| 上栗县| 安徽省| 分宜县| 金华市| 福海县| 南澳县| 巢湖市| 屏边| 合山市| 武清区| 桂东县| 福贡县| 柳林县| 台前县| 贡嘎县| 高邮市| 赤壁市| 海丰县| 留坝县| 宁夏| 东宁县| 安陆市| 古蔺县| 盐边县| 齐河县| 九江县| 兴隆县| 甘泉县| 阳江市| 溧水县| 石泉县| 高安市|