MFC中在picture control中显示jpg图像并用opencv对图像进行后台处理

<一>在MFC的picture control中显示JPG格式的图像

1.借助于CxImage图像库,在MFC自带的图像控件中进行JPG图像的显示;配置环境见之前写的博文。

参考博客:

(1)Cxiamge图像库的使用:https://www.cnblogs.com/lidabo/p/6923426.html

(2)http://blog.csdn.net/u012273127/article/details/60462710

(3)http://blog.csdn.net/friendan/article/details/38358507

自己写的代码:

void CToolsV1Dlg::OnBnClickedOpenimagea() ///对按钮添加的事件处理
{
	// TODO: 在此添加控件通知处理程序代码
	
	//打开图片选择对话框  
	LPCTSTR szFilter = _T("BMP(*.bmp)|*.bmp|JPEG(*.jpg)|*.jpg|ALLSUPORTFILE(*.*)|*.*||");
	CFileDialog dlgBKFile(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, NULL);

	CString strBKFileName;
	//如果按下OK键  
	if (dlgBKFile.DoModal() == IDOK)
	{
		//读取视频文件  
		strBKFileName = dlgBKFile.GetPathName();
	}
	else
	{
		return;
	}

	//建立CxImage的类指针  
	CString strExt; //获取文件后缀名  
	int imageType;  //获取图像类型  

	strExt = FindExtension(strBKFileName);
	imageType = FindType(strExt);

	//判断指针是否为空  
	if (m_pImage1 != NULL)
	{
		delete m_pImage1;
		m_pImage1 = NULL;
	}
	//开辟内存  
	m_pImage1 = new CxImage();
	//打开图片  
	m_pImage1->Load(strBKFileName, imageType);

	if (!m_pImage1->IsValid())
	{
		AfxMessageBox(_T("建立图像指针失败!"));
		delete m_pImage1;
		m_pImage1 = NULL;
		return;
	}

	//绘制图像到相应的图像控件上  
	m_pWnd1 = this->GetDlgItem(IDC_IMAGEA); //<span style = "white-space:pre"></span>//这里一定要和picture Control控件的ID对应起来  
	DrawImgOnCtrl(m_pImage1, m_pWnd1);
}

2.编写过程中遇到的问题:

(1)关于构造函数和析构函数,代码理解:

#include <iostream>
 
using namespace std;
 
class Line
{
   public:
      void setLength( double len );
      double getLength( void );
      Line();   // 这是构造函数声明
      ~Line();  // 这是析构函数声明
 
   private:
      double length;
};
 
// 成员函数定义,包括构造函数
Line::Line(void)
{
    cout << "Object is being created" << endl;
}
Line::~Line(void)
{
    cout << "Object is being deleted" << endl;
}
 
void Line::setLength( double len )
{
    length = len;
}
 
double Line::getLength( void )
{
    return length;
}
// 程序的主函数
int main( )
{
   Line line;
 
   // 设置长度
   line.setLength(6.0); 
   cout << "Length of line : " << line.getLength() <<endl;
 
   return 0;
}

(2) CxImage类与Mat类之间的转化:

//to Mat
CxImage img;
img.Load("C:\\f.jpg");
uint8_t* buf=NULL;
int32_t len=0;
bool rs =img.Encode(buf,len,CXIMAGE_FORMAT_BMP);
cv::Mat temp2;
vector<uchar> buff2;
buff2.resize(len);
memcpy(&buff2[0],buf,len);
temp2= cv::imdecode(buff2,1);
cv::imshow("111",temp2);
cv::waitKey();
 
//to Cximage
vector<uchar> buff;
cv::imencode(".bmp" ,temp2,buff);
CxImage img2(&buff[0],buff.size(),CXIMAGE_FORMAT_BMP);
img2.Blt(GetDlgItem(IDC_STATIC_P)->GetDC()->GetSafeHdc());

(3)由于显示部分用到的是Cximage类对图像进行存储,而opencv处理的代码中,是用Mat类对图像进行存储,二者之间通过IplImage类进行转化;

Mat和IplImage之间的转化:

/IplImage—>Mat  
//EXAMPLE:  
//浅拷贝:  
IplImage* pBinary=cvLoadImage("c://temp.jpg",0);  
Mat Img;  
Img=cvarrToMat(pBinary);  
//深拷贝只需要再在Mat里创建一个新的Mat对象,然后进行数据的复制,再用上述的函数进行数据头的复制(浅拷贝):  
IplImage* pBinary=cvLoadImage("c://temp.jpg", 0);  
Mat ImgTemp;  
Img=cvarrToMat(pBinary);  
Mat Img = ImgTemp.clone();  
  
  
//Mat—>IplImage  
//EXAMPLE:  
//浅拷贝:  
Mat Img=imread("1.jpg");  
IplImage* pBinary = &IplImage(Img);  
//深拷贝只要
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值