绘制Mat图像

GDI

void drawResult (cv::Mat outTrace, unsigned int id)
{
BYTE *g_pBits;
HDC g_hMemDC;
HBITMAP g_hBmp, g_hOldBmp;
CDC *pDC;
CStatic *pic;
int width, height;
CRect rect;

/******************初始化将Mat转为Iplimage************************************/
IplImage tmpIpl = (IplImage)(outTrace);
tmpIpl.imageData = (char*)outTrace.data;
IplImage* img = cvCreateImage (cvGetSize (&tmpIpl), IPL_DEPTH_8U, 3);
cvCvtColor (&tmpIpl, img, CV_GRAY2RGB);

/******************获取控件大小以及句柄************************************/
//TRACE("-----%d\n",((AfxGetApp()->m_pMainWnd)->m_hWnd));
pDC = (AfxGetApp()->m_pMainWnd)->GetDlgItem (id)->GetDC ();
pic = (CStatic*)(AfxGetApp()->m_pMainWnd)->GetDlgItem (id);
pic->GetClientRect (&rect);
width = rect.Width ();
height = rect.Height ();

g_hMemDC = ::CreateCompatibleDC (pDC->m_hDC);//创建兼容DC

BYTE bmibuf[sizeof(BITMAPINFO)+256 * sizeof(RGBQUAD)];
memset (bmibuf, 0, sizeof(bmibuf));
BITMAPINFO *pbmi = (BITMAPINFO*)bmibuf;

pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = img->width;
pbmi->bmiHeader.biHeight = img->height;
pbmi->bmiHeader.biPlanes = 1;
pbmi->bmiHeader.biBitCount = 24;
pbmi->bmiHeader.biCompression = BI_RGB;

g_hBmp = ::CreateDIBSection (g_hMemDC, pbmi, DIB_RGB_COLORS, (void**)&g_pBits, 0, 0);//创建应用程序可以直接写入的、与设备无关的位图(DIB)
g_hOldBmp = (HBITMAP)::SelectObject (g_hMemDC, g_hBmp);//复原兼容DC数据
BitBlt (g_hMemDC, 0, 0, width, height, pDC->m_hDC, 0, 0, SRCCOPY);

//修改图像内容:g_pBits
int l_width = WIDTHBYTES (img->width* pbmi->bmiHeader.biBitCount);
for (int row = 0; row < img->height; row++)
memcpy (&g_pBits[row*l_width], &img->imageData[(img->height - row - 1)*l_width], l_width);

TransparentBlt (pDC->m_hDC, 0, 0, width, height, g_hMemDC, 0, 0, img->width, img->height, RGB (0, 0, 0));
SelectObject (g_hMemDC, g_hOldBmp);

//释放内存资源
cvReleaseImage(&img);
(AfxGetApp()->m_pMainWnd)->ReleaseDC (pDC);
::DeleteDC (g_hMemDC);
DeleteObject (pic);
DeleteObject (g_hBmp);
DeleteObject (g_hOldBmp);
}

D2D

ID2D1Bitmap *t_pDrawBitmap;
cv::Mat bmpImg;
cv::cvtColor(img, bmpImg, CV_BGR2RGBA);
//cv::imshow("TEST1",img);
//cv::imwrite("test.bmp",bmpImg);
//cv::waitKey(0);
D2D1_BITMAP_PROPERTIES t_dbp = { { DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE }, m_hDpi, m_vDpi };
if (SUCCEEDED(m_pRenderTarget->CreateBitmap(D2D1::SizeU(bmpImg.cols, bmpImg.rows), (void*)bmpImg.data, (UINT)bmpImg.step, t_dbp, &t_pDrawBitmap)))
{
D2D1_SIZE_F t_bmpSize = t_pDrawBitmap->GetSize();
m_pRenderTarget->DrawBitmap(t_pDrawBitmap, D2D1::RectF(
rect.left,
rect.top,
rect.right,
rect.bottom));
//m_pRenderTarget->DrawBitmap(t_pDrawBitmap, D2D1::RectF(
// 0,
// 0,
// t_bmpSize.width,
// t_bmpSize.height));
}

时间: 2024-10-07 20:13:48

绘制Mat图像的相关文章

使用QT5绘制OpenCV3的Mat图像

QT在跨平台编程中应用越来越广泛,C++中用跨平台开发界面(包括嵌入式设备),QT基本成为第一选择,OpenCV从3.0开始已经慢慢抛弃了过去的C接口,统一改为C++接口,存储图像的IplImage也在被Mat替代,本文主要讲如何使用QT绘制Mat. 在QT中用QImage存放图像,QImage有多种使用方法,本文讲解QImage的内存分配和将Mat高效复制到QImage中. 一 首先初始化QImage空间 int pixSize = 3; //像素大小 RGB888就是三个字节 uchar *

OpenCV中Mat,图像二维指针和CxImage类的转换

在做图像处理中,常用的函数接口有OpenCV中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转换和相应的对应关系. 一.OpenCV的Mat类到图像二值指针的转换 以下为函数代码: unsigned char** MatTopImgData(Mat img) { //获取图像参数 int row = img.rows; int col = img.cols; int band = img.c

QT自定义opengl的Widget绘制Mat

QT自定义opengl的Widget绘制Mat 宽高 512 修改名字mat 自定义类型 提升为   提升为MatView类   类型已经改变为MatView   新建MatView类cpp文件   添加头文件 修改构造函数(函数实现,调用父类构造函数) 添加宏定义   重载绘制函数 只显示图片使用paintEvent() 若绘制视频相关,需要使用repaint.update相关函数   只要窗口发生变化,都会调用该函数(如:窗口移动了,所以相关业务逻辑,不能放入,只做绘图的业务)   工程文件

Python实用技巧:从Excel读取数据并绘制成图像

本文主要阐述如何使用python从excel读取数据,并用matplotlib绘制成二维图像. 主要知识点为: 使用xlrd扩展包读取excel数据 使用matplotlib绘制二维图像 美化图像,添加标注,注释,显示Latex风格公式,坐标点处透明化处理等技巧 适合人群:适合具有Python基础的用户,对于需要书写实验报告,学位论文,发表文章,做PPT报告的学员具有较大价值. 开发准备 打开Xfce终端,下载并安装的相关依赖 . $ sudo apt-get update $ sudo apt

极坐标系 隐函数 数值求解 并 绘制 函数图像

我写了一个 极坐标系 隐函数 数值求解 并 绘制 函数图像 的 程序   DrawPolarFunc  . 项目地址 :            https://github.com/kelin-xycs/DrawPolarFunc            . 进入 项目页面 后 点击 右边绿色 的 “Clone or download” 按钮 就可以下载 项目文件 了 .  项目中 只有一个 程序文件   DrawPolarFunc.html  , 用 Html5 + javascript  写的

《OpenCV:访问Mat图像中每个像素值》

图像容器Mat 还是先看Mat的存储形式.Mat和Matlab里的数组格式有点像,但一般是二维向量,如果是灰度图,一般存放<uchar>类型:如果是RGB彩色图,存放<Vec3b>类型. 单通道灰度图数据存放格式: 多通道的图像中,每列并列存放通道数量的子列,如RGB三通道彩色图: 注意通道的顺序反转了:BGR.通常情况内存足够大的话图像的每一行是连续存放的,也就是在内存上图像的所有数据存放成一行,这中情况在访问时可以提供很大方便.可以用 isContinuous()函数来判断图像

使用matplotlib绘制导数图像

机器学习中导数用的非常多,本文使用matlotlib绘制函数的导数图像,代码如下: # -*- coding: utf-8 -*- import matplotlib import numpy as np import matplotlib.pyplot as plt # 确定坐标轴 plt.xlim((-3, 3)) plt.ylim((-70, 150)) # 确定函数的x,y值 x1 = np.linspace(-3,3.5,100) def y1(x1): y1 = 3*x1**3 +

Mat 图像和 BMP格式图像的相互转换

目录 一.前言 二.Mat 和 BMP 数据结构 三.转换实现思路 四.Mat 转 BMP 五.BMP转Mat 六.一点体会 一.前言 ? 格式转换很常见,其实在我实现了 Mat 转 BMP 之后才发现原来 imwrite 接口可以直接将 Mat 数据保存为 .bmp图像,不过下文所谈及的转换是在内存中的转换,因为将图像发送给识别服务器时显然不能先将 Mat 保存为 .bmp 文件,然后再读该文件以二进制形式发送给识别服务,而是应该直接在内存中完成其转换. 二.Mat 和 BMP 数据结构 Ma

绘制垃圾图像

#import "MyLayer.h" @implementation MyLayer - (void)drawInContext:(CGContextRef)ctx { // 设置填充色 CGContextSetRGBFillColor(ctx, 1, 0, 0, 1); // 椭圆 CGContextAddEllipseInRect(ctx, CGRectMake(0, 0, 50, 50)); // 填充路径 CGContextFillPath(ctx); } @end #imp