毕设时遇到了一个问题,不能在MFC中显示由GrabCut抠出来的图。经一番折腾发现:
  在OpenCV中如果图像最初是Mat类型的话,就不能通过转换为IplImage,再转换为CvvImage来显示到View里(OpenCV里没有函数能直接将Mat显示到View里),只能通过StretchDIBits来绘制。
  下面介绍StretchDIBits函数的使用方法:(转自:在MFC中应用OpenCV(无CvvImage类))
  1)创建MFC单文档项目(我创建了UseOpenCV),设置包含目录与库目录,添加相关附加依赖项。
  2)在文档头文件(UseOpenCVDoc.h)中添加包含文件
#include #include   添加OpenCV Mat类类型成员变量 m_cvImg,形式如下:
protected: // 仅从序列化创建 CUseOpenCVDoc(); DECLARE_DYNCREATE(CUseOpenCVDoc) cv::Mat m_cvImg;   

3)在文档实现文件(UseOpenCVDoc.cpp)中重写OnOpenDocument函数,如下:
BOOL CUseOpenCVDoc::OnOpenDocument(LPCTSTR lpszPathName) {

if (!CDocument::OnOpenDocument(lpszPathName)) return FALSE;

if (lpszPathName != NULL) {

// 将lpszPathName 转换成 std::string类型 文件名

#ifdef UNICODE

// 中文路径时会存在问题

size_t i = 0;

char* nstring = new char[(wcslen(lpszPathName)+1)*2];

wcstombs_s( &i, nstring, (wcslen(lpszPathName)+1)*2, lpszPathName, (wcslen(lpszPathName)+1)*2);

std::string filename(nstring);

delete[] nstring; #else std::string filename(lpszPathName);

#endif m_cvImg = cv::imread(filename);

if (!m_cvImg.data) { MessageBox(NULL, lpszPathName, _T('图像文件打开失败'), MB_OK); return FALSE; }

} return TRUE;

}   

4)在视图头文件(UseOpenCVView.h)中添加四个成员变量,如下:
protected: cv::Mat m_cvImg; BITMAPINFO* m_bmi;

BITMAPINFOHEADER* m_bmih;

unsigned int m_buffer[sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256];   

5)修改视图类 (CUseOpenCVView)构造函数如下:
CUseOpenCVView::CUseOpenCVView() {

// TODO: 在此处添加构造代码 // 初始化 BITMAPINFO结构 及 BITMAPINFOHEADER结构

m_bmi = (BITMAPINFO*) m_buffer; m_bmih = &(m_bmi->bmiHeader);

memset(m_bmih, 0, sizeof(*m_bmih));

m_bmih->biSize = sizeof(BITMAPINFOHEADER);}   

6)修改视图绘制函数如下:
void CUseOpenCVView::OnDraw(CDC* pDC)

{

CUseOpenCVDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc); if (!pDoc) return;

// TODO: 在此处为本机数据添加绘制代码

m_cvImg = pDoc->m_cvImg; m_bmih->biWidth = m_cvImg.cols; m_bmih->biHeight = -m_cvImg.rows;

// 在自下而上的位图中 高度为负 m_bmih->biPlanes = 1;

m_bmih->biCompression = BI_RGB;

m_bmih->biBitCount = 8 * m_cvImg.channels();

CRect rect; GetClientRect(&rect);

StretchDIBits( pDC->GetSafeHdc(), 0, 0, rect.Width(), rect.Height(), 0, 0, m_cvImg.cols, m_cvImg.rows, m_cvImg.data, (BITMAPINFO*) m_bmi, DIB_RGB_COLORS, SRCCOPY);

}

在OpenCV中将cv::Mat绘制到MFC的视图中相关推荐

  1. 【OpenCV】cv::Mat和std::vector之间的相互转换

    Mat转换成Vector 以vector 为例,其它模型类似 vector getVector(const Mat & a) { Mat b; a.convertTo(b, CV_64F); ...

  2. opencv之cv::Mat像素遍历

    本文介绍的cv::像素遍历方法如下: 使用at成员函数 使用ptr指针访问 使用迭代器iterator 1. 使用at(i, j) 这种方式在Debug模式下的访问速度是最慢的,但是在Release模 ...

  3. 【OpenCV】cv::Mat对单个像素的访问和操作

    我们在使用OpenCV进行图像处理的过程中,经常会涉及到对指定位置像素的读取和修改,下面我们就介绍OpenCV中几种常用的对指定位置像素值的读取和修改操作. 一.at操作 at操作是一种直接简单的对单 ...

  4. 【OpenCV】cv::Mat位深和通道,CV_8UC1等

    位深 每个像素由多少位来存储 是一个精度问题,一般图片是8bit(位)的,则深度是8 通道 每个像素点能存放多少个数 类似于RGB彩色图中的每个像素点有三个值,即三通道 一个图像的通道数是N,就表明每 ...

  5. Mat 显示到MFC中Pictrue Control的问题

    时代在进步,近期忙于工作,好久没能坐在办公室写点关于技术的东西了,想想感觉毕业后工作的几年丢掉了自己的老本行,没有在程序的海洋里徜徉,而是为了应付客户和领导开始不断背离初心.终于现在又有时间写点东西了 ...

  6. 独家|OpenCV 1.1 Mat - 基本图像容器(附链接)

    翻译:陈之炎 校对:吴振东.林夕本文约3600字,建议阅读10分钟本文为大家系统地介绍了OpenCV官方教程. 写在前边 让读者朋友们较为系统地了解和学习OpenCV官方教程,数据派THU翻译组联合研 ...

  7. 【Ubuntu-opencv3.4.0-Error】对‘cv::Mat::updateContinuityFlag()’未定义的引用

    /path/libTrackKcf.a(kcftracker.cpp.o):在函数'ot::KCFTracker::KCFTracker(bool, bool, bool, bool)'中: kcft ...

  8. QImage/cv::Mat/HObject的图像格式互相转换,4字节对齐

    QImage/cv::Mat互相转换 QImage ImgChange::cvMat2QImage(const Mat &mat) // Mat 改成 QImage {if (mat.type ...

  9. tensor转cv::Mat(即CHW转HWC)原理含C#代码实现

    起因是博主在实习过程中的一个任务:需要将模型预测输出tensor的shape从CHW(严格来说是NCHW,但是N=1所以这里忽略掉)转成OpenCV中的cv::Mat类型(即HWC)数据. 由于博主对 ...

最新文章

  1. 编译ceph源码:cython module not found问题的解决
  2. 插值搜索——本质和二分无异,是利用数据分布的规律来定查找点,其基本假设是数据分布均匀...
  3. C++高斯赛德迭代法,求线性方程组的解(version1.0)
  4. 新版ffmpeg PCM编码到AAC,swr_convert转换采样精度,稍微修改兼容PCM编码为G711A及MP3,记录下。
  5. cuda nvprof 输出结果的理解和优化空间
  6. js 判断 undefined,单选 以及下拉框选中状态
  7. the development of c language(转)
  8. 开启防火墙web服务器访问权限 开启必要端口共外部使用
  9. 在Windows中为文件添加“可执行”权限(chmod +x 文件名 不起作用)
  10. 并查集 删除节点 求集合的个数set hdu 2473
  11. php访问url的四种方式
  12. Python和Ruby语言对比
  13. 复旦sakai安装指南
  14. 全美电影票房排行(截止2010.12.19)
  15. burpsuite2.0破解版使用说明
  16. H.264再学习 -- 目前主流的几种数字视频压缩编解码标准(转载)
  17. linux支持ipv6
  18. php trum,口碑曝光TrumoAurora评测如何?怎么样呢?使用报告曝光评测
  19. Html:简单实现弹砖块小游戏
  20. Oracle的表字段带有双引号,Mybatis报 An identifier or literal is invalid

热门文章

  1. 电脑手写输入法_QQ拼音输入法除了能打字,竟然还有 N 多妙用!
  2. 随机森林 python_如何轻松使用python的随机森林
  3. 代码实现sql编译器_【数据蒋堂】第 19 期:从 SQL 语法看集合化
  4. 国产编程语言又造假,丢不起这人!
  5. 10月编程语言排行榜,来了!
  6. 我是这样用extern的...
  7. 基于VHDL的可变速彩灯控制器的设计
  8. php常见问题及其解决方案,PHP开源开发框架ZendFramework使用中常见问题说明及解决方案...
  9. java有var吗_java – Var和Var之间的区别
  10. figtree需要在JAVA下运行吗_Phylogenomic_Tutorial || ML_Tree inference