??:如果这篇文章对你有帮助的话,别忘了点赞👍收藏??哦,您的鼓励就是我创作的动力,谢谢😃 !
一、类型转换
opencv在QT中的应用通常会涉及到这三者的转换,即Mat、QImage、QPixmap。 下面分别给出了
- Mat转QImage
- QImage转Mat
- Mat转QPixmap
1??:Mat转QImage
QImage MainWindow::MatToImage(const Mat &m)
{
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();
}
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)
{
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);
}
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();
return Mat( swapped.height(), swapped.width(), CV_8UC3,
const_cast<uchar*>(swapped.bits()), static_cast<size_t>(swapped.bytesPerLine()) ).clone();
}
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);
}
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类型的数据以二进制数据流的方式保存到数据库中,有些文章是将文件名及其所在的路径保存到数据库中,这个还是要好看项目需求,个人而言,我这个要更复杂一点。 演示效果如下: 1??:基础界面
2??:磨皮处理 3??:数据库中的数据 4??:核心代码
注意: 创建数据表的时候,字段的类型,一定要满足数据的大小,比方说保存图片一般使用blob相关的类型,其中blob最大为64k,mediumblob最大为16M。
思路,先捕获ui控件(我用于显示图片的控件是QLabel)中的数据,然后进行数据库操作。具体步骤如下:
void MainWindow::Upmysql()
{
QImage pix=ui->Process_image->pixmap()->toImage();
Mat m=ImageToMat(pix);
int height = pix.height();
int width = pix.width();
int iSize = m.total() * m.elemSize();
unsigned char* bytes = new unsigned char[iSize];
memcpy(bytes, m.data, iSize * sizeof(unsigned char));
QByteArray sbuf = QByteArray::fromRawData((char *)bytes, iSize * sizeof(unsigned char));
QVariant var(sbuf);
QSqlQuery query;
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))
{
while(query.next())
{
QByteArray TEXT1=query.value(0).toByteArray();
unsigned char *data2;
data2 = reinterpret_cast<unsigned char*>(TEXT1.data());
Mat image=Mat(height,width,CV_8UC3,data2);
QPixmap temp = MatToPixmap(image);
ui->Process_image->setPixmap(temp);
}
}else
{
qDebug()<<"从数据库获取图片失败";
}
}
??:这篇文章到此就结束了,如果意犹未尽的话,可以移步至我的个人主页查看其他文章,感谢您的点赞👍收藏??😃 !
|