将Opencv,Mat类型图片贴图到windows显示设备中

Opencv对图像的显示,有自带的imshow函数完成。但是,如果需要在windows程序中显示图像的时候,就有点小麻烦了。

现介绍一种方法,是在《Learning openCV Second Edition》中介绍的。

代码如下所示:

void CShowPicToDlgDlg::OnBnClickedOk()
{
	RGBTRIPLE* m_bitmapBits;
	//读取图片
	Mat cv_pic_src = imread("11.jpg", CV_LOAD_IMAGE_COLOR);

	//申请图片使用的内存
	m_bitmapBits = new RGBTRIPLE[cv_pic_src.cols * cv_pic_src.rows];

	//声明一个mat
	Mat cv_header_to_dlg_image(
			Size( cv_pic_src.cols, cv_pic_src.rows ),
			CV_8UC3,
			m_bitmapBits
		);

	//图像格式转换
	cvtColor( cv_pic_src, cv_header_to_dlg_image, CV_BGR2RGB );

	//获取绘制区域和设备
	CClientDC dc(this);
	CRect rect;
	GetClientRect(&rect);

	//声明BITMAPINFO头,并将图像贴到设备上。
	BITMAPINFO bmi = {0};
	bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
	bmi.bmiHeader.biCompression = BI_RGB;
	bmi.bmiHeader.biWidth = cv_pic_src.cols;
	bmi.bmiHeader.biHeight = cv_pic_src.rows * -1;	//注意这里,因为BITMAPINFO中数据是反的,因此需要乘 -1 

	bmi.bmiHeader.biPlanes = 1;
	bmi.bmiHeader.biBitCount = 24;

	::StretchDIBits( dc.GetSafeHdc(), 0, 0, rect.Width(), rect.Height(),
					0, 0, bmi.bmiHeader.biWidth, abs(bmi.bmiHeader.biHeight),
					m_bitmapBits,
					&bmi,
					DIB_RGB_COLORS,
					SRCCOPY
					);	

	namedWindow("test");
	imshow("test", cv_header_to_dlg_image);
	waitKey(0);

}

显示效果如下:

通过imshow显示效果如下:

但是实际的图片是这样的:

从这里看,CV_BGR2RGB 转换好像存在颜色上的不确认。到底是什么原因,需要进一步研究。

时间: 2024-12-17 22:11:47

将Opencv,Mat类型图片贴图到windows显示设备中的相关文章

OpenCV Mat 类型定义和赋值

详细介绍请参考官网相关部分链接:http://docs.opencv.org/doc/tutorials/core/mat_the_basic_image_container/mat_the_basic_image_container.html 1.一般的Mat定义方法:cv::Mat M(height,width,<Type>),例: cv::Mat M(480,640,CV_8UC3); 表示定义了一个480行640列的矩阵,矩阵的每个单元的由三个(C3:3 Channel)8位无符号整形

在VLFEAT中mat类型图片转换成constant float* 来进行vl_dsift_process

How to convert an OpenCV cv::Mat into a float* that can be fed into Vlfeat vl_dsift_process: Mat mat = imread("image_name.jpg", 0); // 0 stands for grayscale vector<float> img; for (int i = 0; i < mat.rows; ++i) for (int j = 0; j < m

opencv Mat 多通道c++ 操作方法(适用于Windows/Linux)

最近在做opencv 多通道操作时发现网上例子很少,为了方便记忆就自己写了个demo. 例子在vs2010 + opencv 2.4.9 编译通过,只要配置好opencv 的lib路径就可以运行了. 该方法适用于Windows/Linux下的c++ 操作,Windows 和Ubuntu 都试过没问题. #include <opencv2/opencv.hpp> #include <iostream> #pragma comment ( lib, "opencv_core2

opencv中Mat类型数据操作与遍历

Mat作为opencv中一种数据类型常常用来存储图像,相对与以前的IplImgae类型来说,Mat类型省去了人工的对内存的分配与释放,转而自动分配释放.Mat Class主要包括两部个数据部分:一个是matrix header(包括matrix的大小尺寸,储存方法,储存地址等等..),另一个是指向存储像素值的矩阵的指针. Opencv中对Mat的复制分为两种, Mat A, C; // creates just the header parts A = imread(argv[1], CV_LO

怎么样用opencv将彩色图片转化成像素值只有0和255的灰度图?

  分类: OpenCV [Q1]怎么样用opencv将彩色图片转化成像素值只有0和255的灰度图? 进行灰度化,IplImage* pImg = cvLoadImage( "C:\\1.bmp", 0 ); 这样图像已经灰度化,然后调用cvThreshold(image, image, 125, 255, CV_THRESH_BINARY); 就可以了,125那里是你所用的阈值,这就是最简单的二值化,你要用ostu,或者别的高级一点的,就要自己写函数了   // Truncate v

OpenCV中的Mat类型的内存表示

OpenCV中的Mat类型的内存表示,布布扣,bubuko.com

C++ opencv快速例子学习——读图显示

1.关键函数 1. 读入图片 imread(图片或位置,显示格式)默认为:IMREAD_COLOR 显示格式: IMREAD_UNCHANGED =-1    // 8bit, color or not IMREAD_GRAYSCALE    = 0    // 8bit, gray IMREAD_COLOR           = 1    //  color IMREAD_ANYDEPTH      = 2   // any depth, IMREAD_ANYCOLOR     = 4   

【OpenCV2】MFC中用OPENCV如何将图片显示在指定位置?

在opencv在开发过程中,我想最频繁的操作(之一)莫过于显示图片了. 学过OpenCV的同学都知道,调用cv::imshow()(或者C版本的ShowImage())可以轻而易举的将图片显示出来. 但是,它会创建一个不这么协调的对话框来显示这个图片,那么在MFC中我们如何让图片显示在指定的位置上呢? 先给个结果图(我使用的是VS2010+OpenCV2.4.8): 第一步: 创建一个基于MFC的基本对话框框架了.配置OpenCV环境 第二步:(如果是使用2.2版本以下的跳过) 我们要使用一个非

OpenCV Mat数据类型及位数总结(转载)

OpenCV Mat数据类型及位数总结(转载) 前言 opencv中很多数据结构为了达到內存使用的最优化,通常都会用它最小上限的空间来分配变量,有的数据结构也会因为图像文件格式的关系而给予适当的变量,因此需要知道它们声明的空间大小来配置适当的变量.一 般标准的图片,为RGB格式它们的大小为8bits格式,范围为0~255,对一个int空间的类型来说实在是太小,整整浪费了24bits的空间,假设有个640*480的BMP文件空间存储內存,那整整浪费了640*480*3*(32-8)bits的內存空