QElapsedTimer timer;// 创建计时器 timer.start(); float scale = 0.25; // default 8bits unsigned int maxPixel = 0; char *mpImgRaw; char *mpRGBBuffer; cv::Mat img_raw8(imgRawH, imgRawW, CV_8UC1); cv::Mat img_rawpixel(imgRawH, imgRawW, CV_16SC1, mpImgRaw); // 计算转换比率 for (int i = 0; i < mBitDepth; i++) maxPixel = maxPixel | (1 << i); cv::convertScaleAbs(img_rawpixel, img_raw8, 255.0 / maxPixel); // RAW8 --> 255 cv::Mat rgb(imgRawH, imgRawW, CV_8UC3); cv::cvtColor(img_raw8, rgb, cv::COLOR_BayerGR2RGB); qDebug() << "preProcess time:" << timer.elapsed() << "ms"; memcpy(mpRGBBuffer, rgb.data, rgb.cols * rgb.rows * 3); // TODO:待优化,深copy了,不做线程间为Crash QImage image((uchar *)mpRGBBuffer, rgb.cols, rgb.rows, rgb.step, QImage::Format_RGB888); rimg = image;请帮我把这段代码转换成使用UMat来实现,以此来实现硬件加速
时间: 2024-04-15 20:30:39 浏览: 163
使用UMat来实现硬件加速可以通过以下步骤进行转换:
```cpp
QElapsedTimer timer;
timer.start();
float scale = 0.25; // default 8bits
unsigned int maxPixel = 0;
char *mpImgRaw;
char *mpRGBBuffer;
cv::Mat img_raw8(imgRawH, imgRawW, CV_8UC1);
cv::Mat img_rawpixel(imgRawH, imgRawW, CV_16SC1, mpImgRaw);
// 计算转换比率
for (int i = 0; i < mBitDepth; i++)
maxPixel = maxPixel | (1 << i);
cv::convertScaleAbs(img_rawpixel, img_raw8, 255.0 / maxPixel); // RAW8 --> 255
cv::Mat rgb(imgRawH, imgRawW, CV_8UC3);
cv::cvtColor(img_raw8, rgb, cv::COLOR_BayerGR2RGB);
qDebug() << "preProcess time:" << timer.elapsed() << "ms";
memcpy(mpRGBBuffer, rgb.data, rgb.cols * rgb.rows * 3); // TODO:待优化,深copy了,不做线程间为Crash
QImage image((uchar *)mpRGBBuffer, rgb.cols, rgb.rows, rgb.step, QImage::Format_RGB888);
rimg = image;
```
转换为使用UMat的代码如下:
```cpp
QElapsedTimer timer;
timer.start();
float scale = 0.25; // default 8bits
unsigned int maxPixel = 0;
char *mpImgRaw;
char *mpRGBBuffer;
cv::UMat img_raw8(imgRawH, imgRawW, CV_8UC1);
cv::UMat img_rawpixel(imgRawH, imgRawW, CV_16SC1, mpImgRaw);
// 计算转换比率
for (int i = 0; i < mBitDepth; i++)
maxPixel = maxPixel | (1 << i);
cv::convertScaleAbs(img_rawpixel, img_raw8, 255.0 / maxPixel); // RAW8 --> 255
cv::UMat rgb(imgRawH, imgRawW, CV_8UC3);
cv::cvtColor(img_raw8, rgb, cv::COLOR_BayerGR2RGB);
qDebug() << "preProcess time:" << timer.elapsed() << "ms";
memcpy(mpRGBBuffer, rgb.getMat(cv::ACCESS_READ).data, rgb.cols * rgb.rows * 3); // TODO:待优化,深copy了,不做线程间为Crash
QImage image((uchar *)mpRGBBuffer, rgb.cols, rgb.rows, rgb.step, QImage::Format_RGB888);
rimg = image;
```
在使用UMat时,将cv::Mat替换为cv::UMat,并使用`getMat()`方法获取UMat的底层数据进行拷贝。这样可以利用硬件加速来提高性能。
阅读全文
相关推荐
















