• 本站会放置Google广告用于维持域名以及网站服务器费用。

  • 如果觉得本站的内容有帮助,可以考虑打赏博主哦!

  • 感谢大家访问本站,希望本站的内容可以帮助到大家!

  • 本站由于前段时间遭受到大量临时和国外邮箱注册,所以对可注册的邮箱类型进行了限制!

  • 问题反馈可发送邮件到stubbornhuang@qq.com

  • 欢迎大家交换友链,可在https://www.stubbornhuang.com/申请友情链接进行友链交换申请!

  • 在本站开通年度VIP,无限制下载本站资源和阅读本站文章

  • 计算机图形学与计算几何经典必备书单整理,下载链接可参考:https://www.stubbornhuang.com/1256/

  • 工资「喂饱肚子」,副业「养活灵魂」!

OpenCV – cv::Mat转换为CImage,支持透明通道图片转换

OpenCV 发布于2023-09-25 阅读 2,155次 0次评论 0次点赞 本文共1902个字,阅读需要5分钟。

如果要将新版本的OpenCVcv::Mat显示到HWND上,之前都是说使用修改过的CvvImage类进行显示,但是这个类有个缺点就是不能显示带有透明通道的cv::Mat,而目前好的方式是将cv::Mat转换为MFC的CImage类,不过之前别人写的都只是支持CV_8UC1CV_8UC3cv::Mat对象,也不支持四通道的转换,我在本文中对这个功能进行了扩展,支持CV_8UC4cv::Mat转换为CImage类,这样就支持在HWND上显示透明的cv::Mat图片了。

1 cv::Mat转换为CImage

下面就是我改写的代码,扩展了带有透明通道的cv::Mat转换为CImage

bool RenderCvMatToHWnd::ConvertMat2CImage(const cv::Mat& src_img, CImage& dst_img)
{
    if (src_img.empty())
    {
        return false;
    }

    int width = src_img.cols;           //获取输入图像的宽度  
    int height = src_img.rows;          //获取输入图像的高度  
    int channels = src_img.channels();  //获取输入图像的通道数  
    int type = src_img.type();

    dst_img.Destroy();

    switch (type)
    {
    case CV_8UC1:
    {
        dst_img.Create(width, -1 * height, 8 * channels);
        unsigned char* dst_data = static_cast<unsigned char*>(dst_img.GetBits());
        int step_size = dst_img.GetPitch();     //获取位图行与行之间相差的字节数  
        unsigned char* src_data = nullptr;
        for (int i = 0; i < height; i++)
        {
            src_data = const_cast<unsigned char*>(src_img.ptr<unsigned char>(i));   //获取行指针  
            for (int j = 0; j < width; j++)
            {
                if (step_size > 0)
                {
                    *(dst_data + step_size * i + j) = *src_data++;
                }   //像素的排列方式是自左上开始的  
                else
                {
                    *(dst_data + step_size * i - j) = *src_data++;
                }
            }
        }
        break;
    }
    case CV_8UC3:
    {
        dst_img.Create(width, height, 8 * channels);
        unsigned char* dst_data = static_cast<unsigned char*>(dst_img.GetBits());
        int step_size = dst_img.GetPitch();     //获取位图行与行之间相差的字节数  
        unsigned char* src_data = nullptr;
        for (int i = 0; i < height; i++)
        {
            src_data = const_cast<unsigned char*>(src_img.ptr<unsigned char>(i));   //获取行指针  
            for (int j = 0; j < width; j++)
            {
                for (int k = 0; k < 3; k++)
                {
                    *(dst_data + step_size * i + j * 3 + k) = src_data[3 * j + k];
                }
            }
        }
        break;
    }
    case CV_8UC4:
    {
        dst_img.Create(width, height, 8 * channels);
        unsigned char* dst_data = static_cast<unsigned char*>(dst_img.GetBits());
        int step_size = dst_img.GetPitch();     //获取位图行与行之间相差的字节数  
        unsigned char* src_data = nullptr;
        for (int i = 0; i < height; i++)
        {
            src_data = const_cast<unsigned char*>(src_img.ptr<unsigned char>(i));   //获取行指针  
            for (int j = 0; j < width; j++)
            {
                for (int k = 0; k < 4; k++)
                {
                    *(dst_data + step_size * i + j * 4 + k) = src_data[4 * j + k];
                }
            }
        }
        break;
    }
    default:
        break;
    }

    return true;
}

参考

欢迎扫码关注我的微信公众号,及时获取文章更新

微信公众号二维码

本文作者:StubbornHuang

版权声明:本文为站长原创文章,如果转载请注明原文链接!

原文标题:OpenCV – cv::Mat转换为CImage,支持透明通道图片转换

原文链接:https://www.stubbornhuang.com/2816/

发布于:2023年09月25日 9:47:58

修改于:2023年09月25日 9:47:58

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

文章末尾
上一篇
Windows - 查看dll的加载依赖项和exe的加载依赖项的开源工具Dependencies
开发工具
下一篇
TensorRT - 学习和开发的相关网页备忘
TensorRT
当前分类随机文章推荐

发表评论

您必须 [ 登录 ] 才能发表留言!

关注我们的公众号

微信公众号