Mat to CString

  1. #include "StdAfx.h"   
  2. #include "ImageUtility.h"   
  3.   
  4.   
  5. ImageUtility::ImageUtility(void)  
  6. {  
  7. }  
  8.   
  9.   
  10. ImageUtility::~ImageUtility(void)  
  11. {  
  12. }  
  13.   
  14.   
  15. // 实现cv::Mat 结构到 CImage结构的转化   
  16. void ImageUtility::MatToCImage(Mat& mat, CImage& cImage)  
  17. {  
  18.     int width = mat.cols;  
  19.     int height = mat.rows;  
  20.     int channels = mat.channels();  
  21.   
  22.     cImage.Destroy();//这一步是防止重复利用造成内存问题   
  23.     cImage.Create(width,height,8*channels);  
  24.   
  25.     uchar* ps;  
  26.     uchar* pimg = (uchar*)cImage.GetBits(); //获取CImage的像素存贮区的指针   
  27.     int step = cImage.GetPitch();//每行的字节数,注意这个返回值有正有负   
  28.       
  29.     // 如果是1个通道的图像(灰度图像) DIB格式才需要对调色板设置     
  30.     // CImage中内置了调色板,我们要对他进行赋值:   
  31.     if (1 == channels)  
  32.     {  
  33.         RGBQUAD* ColorTable;    
  34.         int MaxColors=256;    
  35.         //这里可以通过CI.GetMaxColorTableEntries()得到大小(如果你是CI.Load读入图像的话)     
  36.         ColorTable = new RGBQUAD[MaxColors];    
  37.         cImage.GetColorTable(0,MaxColors,ColorTable);//这里是取得指针     
  38.         for (int i=0; i<MaxColors; i++)    
  39.         {    
  40.             ColorTable[i].rgbBlue = (BYTE)i;    
  41.             //BYTE和uchar一回事,但MFC中都用它     
  42.             ColorTable[i].rgbGreen = (BYTE)i;    
  43.             ColorTable[i].rgbRed = (BYTE)i;    
  44.         }    
  45.         cImage.SetColorTable(0,MaxColors,ColorTable);    
  46.         delete []ColorTable;    
  47.     }  
  48.       
  49.   
  50.     for (int i = 0; i < height; i++)  
  51.     {  
  52.         ps = mat.ptr<uchar>(i);  
  53.         for (int j = 0; j < width; j++)  
  54.         {  
  55.             if (1 == channels)  
  56.             {  
  57.                 *(pimg + i*step + j) = ps[j];  
  58.                 //*(pimg + i*step + j) = 105;   
  59.             }  
  60.             else if (3 == channels)  
  61.             {  
  62.                 *(pimg + i*step + j*3) = ps[j*3];  
  63.                 *(pimg + i*step + j*3 + 1) = ps[j*3 + 1];  
  64.                 *(pimg + i*step + j*3 + 2) = ps[j*3 + 2];  
  65.             }  
  66.         }  
  67.     }  
  68.     //string str = CString2StdString(_T("C:\\sample1020.bmp"));   
  69.     //imwrite(str,mat);   
  70.     //这句话就是用来测试cimage有没有被赋值   
  71.     //cImage.Save(_T("C:\\sample1024.bmp"));   
  72. }  
  73.   
  74.   
  75. // CImage结构到Mat结构的转化   
  76. void ImageUtility::CImageToMat(CImage& cImage, Mat& mat)  
  77. {  
  78. }  
  79.   
  80.   
  81. // VS默认工程是Unicode编码(宽字节),有时需要ANSI,即单字节,实现宽到单的转化   
  82. string ImageUtility::CString2StdString(const CString& cstr)  
  83. {     
  84.     CT2A str(cstr);  
  85.     return string(str.m_psz);  
  86. }  
  87.   
  88.   
  89. // 显示图像到指定窗口   
  90. void ImageUtility::DisplayImage(CWnd* m_pMyWnd,const CImage& image)  
  91. {  
  92.       
  93.     CDC *m_pDC = m_pMyWnd->GetDC();//获取窗口所拥有的设备上下文,用于显示图像   
  94.     m_pMyWnd->UpdateWindow();  
  95.   
  96.     CRect rc;  
  97.     m_pMyWnd->GetWindowRect(&rc);  
  98.   
  99.     /*InvalidateRect(m_pMyWnd->m_hWnd,&rc,true);*/  
  100.     int nwidth = rc.Width();  
  101.     int nheight = rc.Height();  
  102.   
  103.     int fixed_width = min(image.GetWidth(),nwidth);  
  104.     int fixed_height = min(image.GetHeight(),nheight);  
  105.   
  106.     double ratio_w = fixed_width / (double)image.GetWidth();  
  107.     double ratio_h = fixed_height / (double)image.GetHeight();  
  108.     double ratio = min(ratio_w,ratio_h);  
  109.   
  110.     int show_width = (int)(image.GetWidth() * ratio);  
  111.     int show_height = (int)(image.GetHeight() * ratio);  
  112.   
  113.     int offsetx = (nwidth - show_width) / 2;  
  114.     int offsety = (nheight - show_height) / 2;  
  115.   
  116.     ::SetStretchBltMode(m_pDC->GetSafeHdc(),COLORONCOLOR);//设置位图的伸缩模式   
  117.     image.StretchBlt(m_pDC->GetSafeHdc(),offsetx,offsety,show_width,show_height,  
  118.         0,0,image.GetWidth(),image.GetHeight(),SRCCOPY);  
  119. }  
  120.   
  121.   
  122. // 格式转换,AWX云图转到可以显示的opencv支持的格式   
  123. Mat ImageUtility::AWX2Mat(CString filePath)  
  124. {  
  125.     CFile fp;  
  126.     Mat   mat;  
  127.     fp.Open(filePath,CFile::modeRead);  
  128.     ULONGLONG flength = fp.GetLength();  
  129.   
  130.     if (2475700 == flength)  
  131.     {  
  132.         mat.create(1300,1900,CV_8UC1);  
  133.     }  
  134.     else if (1444803 == flength)  
  135.     {  
  136.         mat.create(1201,1201,CV_8UC1);  
  137.     }  
  138.   
  139.     LONGLONG size = mat.rows * mat.cols;  
  140.     LONGLONG sizebuff = fp.Seek(-size, CFile::end);  
  141.   
  142.     uchar *pSource = new uchar[size];  
  143.     fp.Read(pSource,size);  
  144.     fp.Close();  
  145.   
  146.     for (int i = 0; i<mat.rows; i++)  
  147.     {  
  148.         uchar * ps = mat.ptr<uchar>(i);  
  149.         for (int j = 0 ; j < mat.cols; j++)  
  150.         {  
  151.             ps[j] = *(pSource + i*mat.cols + j);  
  152.         }  
  153.     }  
  154.     delete pSource;  
  155.   
  156.       
  157.       
  158.     return mat;  
  159. }  
  160.   
  161.   
  162. void ImageUtility::DisplayImageEx(CWnd* pWnd, const CImage& image)  
  163. {  
  164.     CDC *m_pDC = pWnd->GetDC();//获取窗口所拥有的设备上下文,用于显示图像   
  165.     pWnd->UpdateWindow();  
  166.   
  167.     CRect rc;  
  168.     //客户区大小   
  169.     //CRect rc1;   
  170.     pWnd->GetWindowRect(&rc);  
  171.       
  172.      
  173.     //ScreenToClient(&rc);   
  174.       
  175.     ::SetStretchBltMode(m_pDC->GetSafeHdc(),COLORONCOLOR);//设置位图的伸缩模式   
  176.     image.StretchBlt(m_pDC->GetSafeHdc(),0,0,rc.Width()-1,rc.Height()-1,  
  177.         0,0,image.GetWidth(),image.GetHeight(),SRCCOPY);  
  178. }  
#include "StdAfx.h"
#include "ImageUtility.h"


ImageUtility::ImageUtility(void)
{
}


ImageUtility::~ImageUtility(void)
{
}


// 实现cv::Mat 结构到 CImage结构的转化
void ImageUtility::MatToCImage(Mat& mat, CImage& cImage)
{
	int width = mat.cols;
	int height = mat.rows;
	int channels = mat.channels();

	cImage.Destroy();//这一步是防止重复利用造成内存问题
	cImage.Create(width,height,8*channels);

	uchar* ps;
	uchar* pimg = (uchar*)cImage.GetBits(); //获取CImage的像素存贮区的指针
	int step = cImage.GetPitch();//每行的字节数,注意这个返回值有正有负
	
	// 如果是1个通道的图像(灰度图像) DIB格式才需要对调色板设置  
	// CImage中内置了调色板,我们要对他进行赋值:
	if (1 == channels)
	{
		RGBQUAD* ColorTable;  
		int MaxColors=256;  
		//这里可以通过CI.GetMaxColorTableEntries()得到大小(如果你是CI.Load读入图像的话)  
		ColorTable = new RGBQUAD[MaxColors];  
		cImage.GetColorTable(0,MaxColors,ColorTable);//这里是取得指针  
		for (int i=0; i<MaxColors; i++)  
		{  
			ColorTable[i].rgbBlue = (BYTE)i;  
			//BYTE和uchar一回事,但MFC中都用它  
			ColorTable[i].rgbGreen = (BYTE)i;  
			ColorTable[i].rgbRed = (BYTE)i;  
		}  
		cImage.SetColorTable(0,MaxColors,ColorTable);  
		delete []ColorTable;  
	}
	

	for (int i = 0; i < height; i++)
	{
		ps = mat.ptr<uchar>(i);
		for (int j = 0; j < width; j++)
		{
			if (1 == channels)
			{
				*(pimg + i*step + j) = ps[j];
				//*(pimg + i*step + j) = 105;
			}
			else if (3 == channels)
			{
				*(pimg + i*step + j*3) = ps[j*3];
				*(pimg + i*step + j*3 + 1) = ps[j*3 + 1];
				*(pimg + i*step + j*3 + 2) = ps[j*3 + 2];
			}
		}
	}
	//string str = CString2StdString(_T("C:\\sample1020.bmp"));
	//imwrite(str,mat);
	//这句话就是用来测试cimage有没有被赋值
	//cImage.Save(_T("C:\\sample1024.bmp"));
}


// CImage结构到Mat结构的转化
void ImageUtility::CImageToMat(CImage& cImage, Mat& mat)
{
}


// VS默认工程是Unicode编码(宽字节),有时需要ANSI,即单字节,实现宽到单的转化
string ImageUtility::CString2StdString(const CString& cstr)
{   
	CT2A str(cstr);
	return string(str.m_psz);
}


// 显示图像到指定窗口
void ImageUtility::DisplayImage(CWnd* m_pMyWnd,const CImage& image)
{
	
	CDC *m_pDC = m_pMyWnd->GetDC();//获取窗口所拥有的设备上下文,用于显示图像
	m_pMyWnd->UpdateWindow();

	CRect rc;
	m_pMyWnd->GetWindowRect(&rc);

	/*InvalidateRect(m_pMyWnd->m_hWnd,&rc,true);*/
	int nwidth = rc.Width();
	int nheight = rc.Height();

	int fixed_width = min(image.GetWidth(),nwidth);
	int fixed_height = min(image.GetHeight(),nheight);

	double ratio_w = fixed_width / (double)image.GetWidth();
	double ratio_h = fixed_height / (double)image.GetHeight();
	double ratio = min(ratio_w,ratio_h);

	int show_width = (int)(image.GetWidth() * ratio);
	int show_height = (int)(image.GetHeight() * ratio);

	int offsetx = (nwidth - show_width) / 2;
	int offsety = (nheight - show_height) / 2;

	::SetStretchBltMode(m_pDC->GetSafeHdc(),COLORONCOLOR);//设置位图的伸缩模式
	image.StretchBlt(m_pDC->GetSafeHdc(),offsetx,offsety,show_width,show_height,
		0,0,image.GetWidth(),image.GetHeight(),SRCCOPY);
}


// 格式转换,AWX云图转到可以显示的opencv支持的格式
Mat ImageUtility::AWX2Mat(CString filePath)
{
	CFile fp;
	Mat   mat;
	fp.Open(filePath,CFile::modeRead);
	ULONGLONG flength = fp.GetLength();

	if (2475700 == flength)
	{
		mat.create(1300,1900,CV_8UC1);
	}
	else if (1444803 == flength)
	{
		mat.create(1201,1201,CV_8UC1);
	}

	LONGLONG size = mat.rows * mat.cols;
	LONGLONG sizebuff = fp.Seek(-size, CFile::end);

	uchar *pSource = new uchar[size];
	fp.Read(pSource,size);
	fp.Close();

	for (int i = 0; i<mat.rows; i++)
	{
		uchar * ps = mat.ptr<uchar>(i);
		for (int j = 0 ; j < mat.cols; j++)
		{
			ps[j] = *(pSource + i*mat.cols + j);
		}
	}
	delete pSource;

	
	
	return mat;
}


void ImageUtility::DisplayImageEx(CWnd* pWnd, const CImage& image)
{
	CDC *m_pDC = pWnd->GetDC();//获取窗口所拥有的设备上下文,用于显示图像
	pWnd->UpdateWindow();

	CRect rc;
	//客户区大小
	//CRect rc1;
	pWnd->GetWindowRect(&rc);
	
   
	//ScreenToClient(&rc);
	
	::SetStretchBltMode(m_pDC->GetSafeHdc(),COLORONCOLOR);//设置位图的伸缩模式
	image.StretchBlt(m_pDC->GetSafeHdc(),0,0,rc.Width()-1,rc.Height()-1,
		0,0,image.GetWidth(),image.GetHeight(),SRCCOPY);
}

上面是源文件,下面是头文件

  1. #pragma once   
  2.   
  3. #include <opencv2/core/core.hpp>   
  4. #include <opencv2/imgproc/imgproc.hpp>   
  5. #include <opencv2/highgui/highgui.hpp>   
  6.   
  7. using namespace cv;  
  8. using namespace std;  
  9.   
  10. class ImageUtility  
  11. {  
  12. public:  
  13.     ImageUtility(void);  
  14.     ~ImageUtility(void);  
  15.     // 实现cv::Mat 结构到 CImage结构的转化   
  16.     void MatToCImage(Mat& mat, CImage& cImage);  
  17.     // CImage结构到Mat结构的转化   
  18.     void CImageToMat(CImage& cImage, Mat& mat);  
  19.     // VS默认工程是Unicode编码(宽字节),有时需要ANSI,即单字节,实现宽到单的转化   
  20.     string CString2StdString(const CString& cstr);  
  21.     // 显示图像到指定窗口   
  22.     void DisplayImage(CWnd* m_pMyWnd,const CImage& image);  
  23.     // 格式转换,AWX云图转到可以显示的opencv支持的格式   
  24.     Mat AWX2Mat(CString filePath);  
  25.     void DisplayImageEx(CWnd* pWnd, const CImage& image);  
  26. };  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值