opencv 读取3G大图失败,又不想重新编译opencv ,可以如下操作

先到这里:nothings/stb: stb single-file public domain libraries for C/C++下载一个stb_image.h头文件,把其放到工程里,然后添加如下代码:

cpp 复制代码
#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处理了,点赞收藏呀

相关推荐
irislinAmelia3 小时前
缺陷检测AI关键点在哪
人工智能·嵌入式硬件·1024程序员节
Ai-_Man3 小时前
Meta Muse还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·人工智能·ai·小程序·c#·1024程序员节
安托智造3 小时前
MBD:从二维图纸到三维模型的制造革命(下)
大数据·人工智能·制造·mbd
火山引擎开发者社区3 小时前
VeOps 深度调查:让 AI 排障从“能用”走向“可靠”
人工智能
梓豪csd3 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
王中阳Go3 小时前
两个入口答案不一致先别调模型:6 行入口口径对账表(附脚本)
人工智能·后端·python·大语言模型·1024程序员节
武天旭3 小时前
AI安全--AI大模型的隐私保护与法律法规
人工智能·安全
Solange__3 小时前
影视预演怎么用AI生成3D场景?从分镜、Blockout到镜头交付的完整流程
人工智能·游戏·3d·ai·自然语言处理·aigc·游戏策划
冬奇Lab3 小时前
一次 Skill 评测的复盘:我推翻了一份现成的模型选型结论,然后自己造了个评测平台
人工智能·llm·agent
不脱发的程序猿4 小时前
纳指ETF量化策略
数据库·人工智能·1024程序员节