先到这里:nothings/stb: stb single-file public domain libraries for C/C++下载一个stb_image.h头文件,把其放到工程里,然后添加如下代码:
#include <opencv2/opencv.hpp>
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h" // 确保路径正确
int main() {
const char* filename = "huge_image.bmp"; // 支持 BMP/PNG/JPEG/TIFF等
// 1. 使用 STB Image 加载图像
int width, height, channels;
unsigned char* data = stbi_load(filename, &width, &height, &channels, 0);
if (!data) {
std::cerr << "Error: Failed to load image (" << stbi_failure_reason() << ")" << std::endl;
return -1;
}
// 2. 将数据转换为 OpenCV Mat
cv::Mat img;
switch (channels) {
case 1: // 灰度图
img = cv::Mat(height, width, CV_8UC1, data);
break;
case 3: // RGB
img = cv::Mat(height, width, CV_8UC3, data);
cv::cvtColor(img, img, cv::COLOR_RGB2BGR); // STB 返回 RGB,OpenCV 默认 BGR
break;
case 4: // RGBA
img = cv::Mat(height, width, CV_8UC4, data);
cv::cvtColor(img, img, cv::COLOR_RGBA2BGRA);
break;
default:
std::cerr << "Error: Unsupported number of channels: " << channels << std::endl;
stbi_image_free(data);
return -1;
}
// 3. 检查转换结果
if (img.empty()) {
std::cerr << "Error: Failed to create cv::Mat" << std::endl;
stbi_image_free(data);
return -1;
}
std::cout << "Success! Image size: " << img.cols << "x" << img.rows
<< ", Channels: " << img.channels() << std::endl;
// 4. 释放 STB Image 内存(注意:此时 Mat 仍引用数据!)
// 如果后续需要独立使用 Mat,需克隆数据:
// cv::Mat img_clone = img.clone();
// stbi_image_free(data);
// 直接使用 img(需确保在释放 data 前完成操作)
cv::imshow("Image", img);
cv::waitKey(0);
stbi_image_free(data); // 释放内存
return 0;
}
最好是使用stb_img读取内存后转mat,然后立刻clone,然后是否stb的内存,这样就可以使用opencv处理了,点赞收藏呀