OpenCV与QT图片格式转换实用函数集
需积分: 35 191 浏览量
更新于2024-10-28
收藏 2KB ZIP 举报
资源摘要信息:"OpenCV与QT开发时一些转换函数.zip"
OpenCV与QT是两个强大的库,在图像处理与图形用户界面(GUI)开发领域中具有广泛的应用。在使用OpenCV进行图像处理和使用QT构建用户界面时,经常需要在两者之间进行图像数据类型的转换。以下将详细解释在标题中提到的转换函数,并解释它们的实现和使用场景。
(1) 将QImage图片转为OpenCV的IplImage格式
在OpenCV中,图像通常以IplImage指针的形式来处理。要将QT中的QImage对象转换为IplImage格式,可以创建一个对应的函数。函数基本的实现方式如下:
```cpp
IplImage* Widget::QImage_to_IplImage(const QImage * qImage) {
uchar *data = qImage->bits();
int depth = qImage->depth() == 32 ? 24 : qImage->depth();
int channels = depth / 8;
IplImage *ipl = cvCreateImage(cvSize(qImage->width(), qImage->height()), IPL_DEPTH_8U, channels);
memcpy(ipl->imageData, data, qImage->byteCount());
return ipl;
}
```
此函数将QImage数据复制到一个新创建的IplImage对象中,以便在OpenCV函数中使用。
(2) 将OpenCV的图片转为QImage格式
与转换过程相反,可以将OpenCV的IplImage格式转换为QImage格式,以便在QT界面中显示。函数实现如下:
```cpp
QImage *Widget::IplImage_to_QImage(IplImage *img) {
int depth = img->nChannels * 8;
QImage qimg(img->width, img->height, QImage::Format_ARGB32);
uchar *src = (uchar*)img->imageData;
uchar *dst = (uchar*)qimg.bits();
int step = img->widthStep;
for (int y = 0; y < img->height; y++, src += step, dst += qimg.bytesPerLine()) {
for (int x = 0; x < img->width * img->nChannels; x++) {
dst[x * 4] = src[x]; // OpenCV uses BGR and Qt uses RGB
dst[x * 4 + 1] = src[x + 1];
dst[x * 4 + 2] = src[x + 2];
dst[x * 4 + 3] = 255; // Opaque
}
}
return new QImage(qimg);
}
```
这里需要注意的是OpenCV默认采用BGR格式,而QT使用RGB格式,因此在转换过程中需要将BGR转换为RGB。
(3) 将QImage图片转为Mat格式
对于图像处理操作,更推荐将QImage转换为OpenCV的Mat格式,因为它提供了更丰富的图像处理功能。实现转换的函数可能如下:
```cpp
Mat Widget::QImage_to_cvMat(QImage image) {
Mat mat(image.height(), image.width(), CV_8UC3, image.bits(), image.bytesPerLine());
return mat.clone(); // 返回clone以避免在QImage析构时失效
}
```
(4) 将Mat图片转为QImage格式
处理完图像后,可能需要将Mat格式的图像转换回QImage格式以在QT界面中显示。实现如下:
```cpp
QImage Widget::Mat_to_QImage(const Mat& InputMat) {
if (InputMat.empty()) {
return QImage();
}
if (InputMat.type() != CV_8UC3 && InputMat.type() != CV_8UC1) {
return QImage();
}
QImage qimage;
if (InputMat.type() == CV_8UC3) {
qimage = QImage(InputMat.data, InputMat.cols, InputMat.rows, InputMat.step, QImage::Format_RGB888).rgbSwapped();
} else {
qimage = QImage(InputMat.data, InputMat.cols, InputMat.rows, InputMat.step, QImage::Format_Grayscale8);
}
return qimage.copy();
}
```
注意,同样需要处理BGR到RGB的颜色转换以及确保图像的深度。
(5) QLabel显示函数
为了在QT应用程序中的QLabel组件上显示图像,可以编写一个辅助函数:
```cpp
void Widget::show_face(IplImage* img) {
QImage *qimg = IplImage_to_QImage(img);
QLabel *label = new QLabel;
QPixmap pixmap = QPixmap::fromImage(*qimg);
label->setPixmap(pixmap.scaled(label->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
delete qimg; // 注意不要忘记释放分配的QImage资源
}
```
在这里,IplImage转为QImage之后,通过QPixmap对象来在QLabel上显示。
通过这些转换函数,开发者可以方便地在OpenCV和QT之间进行图像数据的传递和处理,使得在进行复杂的图像处理任务时,能够利用QT的友好界面为用户提供实时的可视化反馈。
2021-02-25 上传
2020-03-03 上传
2021-10-14 上传
2023-09-04 上传
2023-12-17 上传
2023-04-30 上传
2023-06-07 上传
2023-12-09 上传
2023-12-26 上传
DS小龙哥
- 粉丝: 4w+
- 资源: 897
最新资源
- 探索AVL树算法:以Faculdade Senac Porto Alegre实践为例
- 小学语文教学新工具:创新黑板设计解析
- Minecraft服务器管理新插件ServerForms发布
- MATLAB基因网络模型代码实现及开源分享
- 全方位技术项目源码合集:***报名系统
- Phalcon框架实战案例分析
- MATLAB与Python结合实现短期电力负荷预测的DAT300项目解析
- 市场营销教学专用查询装置设计方案
- 随身WiFi高通210 MS8909设备的Root引导文件破解攻略
- 实现服务器端级联:modella与leveldb适配器的应用
- Oracle Linux安装必备依赖包清单与步骤
- Shyer项目:寻找喜欢的聊天伙伴
- MEAN堆栈入门项目: postings-app
- 在线WPS办公功能全接触及应用示例
- 新型带储订盒订书机设计文档
- VB多媒体教学演示系统源代码及技术项目资源大全