cv::Mat mat; mat.create(m_height, m_width, CV_8UC3); const cv::Mat buffer_mat(m_height, m_width, CV_16UC1, pBuff); cv::normalize(buffer_mat, mat, 0, 255, cv::NORM_MINMAX, CV_8UC3); cv::Mat dst_mat; cv::cvtColor(mat, dst_mat, cv::COLOR_BayerRG2RGB);优化这段代码
时间: 2024-02-01 18:13:41 浏览: 106
这段代码的主要目的是将一个输入的16位图像数据转换为8位RGB图像。这里有几个可以优化的地方:
1. 避免不必要的临时变量:可以避免使用 buffer_mat 作为临时变量,直接使用 pBuff 进行归一化操作。
2. 减少拷贝次数:可以在创建 mat 时直接使用 pBuff 进行初始化,避免创建一个额外的 16 位图像。
3. 使用 OpenCV 的函数代替手动计算:可以使用 cv::convertScaleAbs 函数代替 cv::normalize 函数进行归一化,在 cv::cvtColor 中使用 cv::COLOR_BayerBG2RGB 代替 cv::COLOR_BayerRG2RGB。
下面是优化后的代码:
```
cv::Mat mat(m_height, m_width, CV_8UC3, pBuff);
cv::convertScaleAbs(mat, mat, 255.0 / std::numeric_limits<uint16_t>::max());
cv::cvtColor(mat, mat, cv::COLOR_BayerBG2RGB);
```
这里使用了 cv::convertScaleAbs 函数直接对 mat 进行归一化,并且在 cv::cvtColor 中使用 cv::COLOR_BayerBG2RGB。
相关问题
uint8_t* yuv to mat, 老版本
下面是将 YUV 格式的图像转换为 OpenCV Mat 格式的代码,适用于老版本的 OpenCV。
```cpp
void yuv_to_mat(const uint8_t* yuv, int width, int height, cv::Mat& output_mat)
{
// 计算 YUV 分量大小
int y_size = width * height;
int uv_size = y_size / 4;
// 创建 Mat 对象
output_mat.create(height + height / 2, width, CV_8UC1);
// 拷贝 Y 分量
memcpy(output_mat.data, yuv, y_size);
// 拷贝 U 和 V 分量
const uint8_t* u = yuv + y_size;
const uint8_t* v = u + uv_size;
for (int i = 0; i < uv_size; i++)
{
output_mat.data[y_size + i * 2] = u[i];
output_mat.data[y_size + i * 2 + 1] = v[i];
}
// 转换颜色空间
cv::cvtColor(output_mat, output_mat, cv::COLOR_YUV2BGR_I420);
}
```
该函数首先计算 YUV 分量的大小,然后创建一个大小为 height + height / 2 x width 的 Mat 对象来存储转换后的图像。接着,将 Y 分量拷贝到 Mat 对象的第一个通道,将 U 和 V 分量分别拷贝到 Mat 对象的第二个和第三个通道。最后,使用 cv::cvtColor 函数将 YUV 转换为 BGR 颜色空间。
安卓开发 Bitmap.Config.ARGB_4444的位图传给c++ 该如何接收这张位图并显示
要将安卓开发中的 Bitmap.Config.ARGB_4444 格式的位图传递给C++,您需要将该位图转换为C++中的图像格式,并使用OpenCV库在C++中显示该图像。下面是一个简单的示例代码,用于将ARGB_4444图像转换为OpenCV中的Mat格式:
```
// 将Android Bitmap转换为OpenCV Mat
cv::Mat bitmapToMat(JNIEnv* env, jobject bitmap) {
AndroidBitmapInfo info;
void* pixels = 0;
cv::Mat dst;
try {
CV_Assert(AndroidBitmap_getInfo(env, bitmap, &info) >= 0);
CV_Assert(info.format == ANDROID_BITMAP_FORMAT_RGBA_8888 ||
info.format == ANDROID_BITMAP_FORMAT_RGB_565 ||
info.format == ANDROID_BITMAP_FORMAT_RGBA_4444);
CV_Assert(AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0);
CV_Assert(pixels);
dst.create(info.height, info.width, CV_8UC4);
if (info.format == ANDROID_BITMAP_FORMAT_RGBA_8888) {
cv::Mat tmp(info.height, info.width, CV_8UC4, pixels);
tmp.copyTo(dst);
} else if (info.format == ANDROID_BITMAP_FORMAT_RGB_565) {
cv::Mat tmp(info.height, info.width, CV_8UC2, pixels);
cvtColor(tmp, dst, cv::COLOR_BGR5652RGBA);
} else if (info.format == ANDROID_BITMAP_FORMAT_RGBA_4444) {
cv::Mat tmp(info.height, info.width, CV_8UC2, pixels);
cvtColor(tmp, dst, cv::COLOR_BGRA4444_RGBA);
}
} catch (const cv::Exception& e) {
AndroidBitmap_unlockPixels(env, bitmap);
jclass je = env->FindClass("org/opencv/core/CvException");
if (!je) je = env->FindClass("java/lang/Exception");
env->ThrowNew(je, e.what());
return dst;
}
AndroidBitmap_unlockPixels(env, bitmap);
return dst;
}
// 在C++中显示OpenCV Mat
void showMat(cv::Mat& mat) {
cv::imshow("Image", mat);
cv::waitKey(0);
}
```
在您的C++代码中,您可以将ARGB_4444位图转换为OpenCV Mat,然后使用 showMat 函数在窗口中显示它:
```
jobject bitmap = ... // 获取ARGB_4444格式的Bitmap对象
cv::Mat mat = bitmapToMat(env, bitmap);
showMat(mat);
```
请注意,您需要在C++中包含以下头文件才能使用这些函数:
```
#include <jni.h>
#include <android/bitmap.h>
#include <opencv2/opencv.hpp>
```
阅读全文