QImage转opencv
时间: 2023-06-30 08:13:06 浏览: 54
将QImage转换为OpenCV中的Mat可以通过以下步骤完成:
1. 将QImage转换为QPixmap
```
QPixmap pixmap = QPixmap::fromImage(qimage);
```
2. 将QPixmap转换为cv::Mat
```
cv::Mat cvimg;
QPixmap pixmap = QPixmap::fromImage(qimage);
QPixmap pixmap_copy = pixmap.copy(); // Make a deep copy of the pixmap
QImage img = pixmap_copy.toImage();
cvimg = cv::Mat(img.height(), img.width(), CV_8UC4, img.bits(), img.bytesPerLine());
```
注意:上述代码假设QImage的格式为32位ARGB,如果QImage的格式不同,需要进行适当的转换。
相关问题
QImage 转opencv
将 `QImage` 转为 `cv::Mat` 可以通过以下步骤实现:
1. 将 `QImage` 转为 RGB 彩色图像:
```cpp
QImage qimg; // 假设已经加载了一张 QImage 图像
cv::Mat img(qimg.height(), qimg.width(), CV_8UC3, qimg.bits(), qimg.bytesPerLine());
cv::cvtColor(img, img, cv::COLOR_BGR2RGB);
```
这里我们首先创建一个 `cv::Mat` 对象 `img`,大小与 `QImage` 相同,像素数据指针指向 `QImage` 的 `bits()`,并且使用 `QImage` 的 `bytesPerLine()` 作为步长。然后使用 `cv::cvtColor()` 函数将 `img` 从 BGR 格式转换为 RGB 格式。
2. 如果需要将 RGB 彩色图像转为灰度图像,可以使用以下代码:
```cpp
cv::Mat gray_img;
cv::cvtColor(img, gray_img, cv::COLOR_RGB2GRAY);
```
这里我们创建一个新的 `cv::Mat` 对象 `gray_img`,并使用 `cv::cvtColor()` 函数将 `img` 从 RGB 格式转换为灰度格式。
注意:在将 `QImage` 转为 `cv::Mat` 时,需要保证 `QImage` 的格式为 `QImage::Format_RGB888` 或 `QImage::Format_ARGB32`。如果 `QImage` 的格式为其他值,则需要先将其转为这两种格式再进行转换。
opencv mat转qimage
将 OpenCV 中的 Mat 转换为 Qt 中的 QImage,可以使用以下代码:
```cpp
QImage MatToQImage(const cv::Mat& mat)
{
// 8-bits unsigned, NO. OF CHANNELS = 1
if(mat.type() == CV_8UC1)
{
// Set the color table (used to translate color indexes to qRgb values)
QVector<QRgb> colorTable;
for (int i = 0; i < 256; i++)
colorTable.push_back(qRgb(i, i, i));
// Copy input Mat
const uchar *qImageBuffer = (const uchar*)mat.data;
// Create QImage with same dimensions as input Mat
QImage img(qImageBuffer, mat.cols, mat.rows, mat.step, QImage::Format_Indexed8);
img.setColorTable(colorTable);
return img;
}
// 8-bits unsigned, NO. OF CHANNELS = 3
else if(mat.type() == CV_8UC3)
{
// Copy input Mat
const uchar *qImageBuffer = (const uchar*)mat.data;
// Create QImage with same dimensions as input Mat
QImage img(qImageBuffer, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);
return img.rgbSwapped();
}
else
{
qWarning() << "MatToQImage() - cv::Mat image type not handled in switch:" << mat.type();
return QImage();
}
}
```
其中,如果 Mat 的类型为 `CV_8UC1`,表示它是一个单通道的灰度图像,我们需要为其创建一个颜色表,并使用 `QImage::Format_Indexed8` 格式创建 QImage。对于类型为 `CV_8UC3`,表示它是一个三通道的彩色图像,我们使用 `QImage::Format_RGB888` 格式创建 QImage,然后使用 `rgbSwapped()` 方法转换颜色空间。如果 Mat 的类型不是这两种类型,则返回一个空 QImage。