`
java-mans
  • 浏览: 11414827 次
文章分类
社区版块
存档分类
最新评论

OpenCV打开和显示图像

 
阅读更多

新建一单文档滚动视图AppExe。源文件链接

doc类添加变量

public:
	int ReadImage(LPCTSTR lpszPathName);
	int imageWidth,imageHeight;		//滚动视图大小
	BITMAPINFO * lpbmi;			//bmp显示缓存,必需
	IplImage* m_pImage;			//图像指针

变量初始化
CImageProcessDoc::CImageProcessDoc()
{
	// TODO: add one-time construction code here
	m_pImage=NULL;
	lpbmi=NULL;
	imageWidth=imageHeight=100;		//初始滚动视图大小


}

读取图像函数,不能直接按下面代码定义ReadImage(IplImage*image,LPCTSTR lpszPathName,BITMAPINFO* lpbmi),因为局部函数产生的内存不能传递给image和lpbmi,最后image和lpbmi都是NULL,要想使用ReadImage(IplImage*image,LPCTSTR lpszPathName,BITMAPINFO* lpbmi),必需在函数外分配image和lpbmi内存大小,谨记不要在函数里使用new函数分配内存返回给参数,分配的内存不知道会跑到哪里!
int CImageProcessDoc::ReadImage(LPCTSTR lpszPathName)
{
	m_pImage=cvLoadImage(lpszPathName);
	lpbmi=(LPBITMAPINFO)new char[sizeof(BITMAPINFO)+4*(1<<8)];
	
	lpbmi->bmiHeader.biBitCount=m_pImage->depth*m_pImage->nChannels;
	lpbmi->bmiHeader.biClrUsed=0;
	lpbmi->bmiHeader.biHeight=m_pImage->height;	
	lpbmi->bmiHeader.biWidth=m_pImage->width;	
	lpbmi->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
	lpbmi->bmiHeader.biSizeImage=m_pImage->width*m_pImage->height*m_pImage->nChannels;
	lpbmi->bmiHeader.biClrImportant=0;	
	lpbmi->bmiHeader.biCompression=0;	
	lpbmi->bmiHeader.biPlanes=1;//m_pImage->nChannels;		
	for(int i=0;i<(1<<8);i++)	
	{	
		RGBQUAD &o=lpbmi->bmiColors[i];
		o.rgbBlue=i;	
		o.rgbGreen=i;	
		o.rgbRed=i;	
		o.rgbReserved=0;		
	}
	return TRUE;

}
打开文件操作,因为每次打开文件都会新建一视图,并调用视图的OnInitialUpdate函数,所以并不需要添加UpdateAllViews函数(这里是单文档SDI)
BOOL CImageProcessDoc::OnOpenDocument(LPCTSTR lpszPathName) 
{
	if (!CDocument::OnOpenDocument(lpszPathName))
		return FALSE;
	
	if(ReadImage(lpszPathName))
	{
		imageHeight=m_pImage->height;
		imageWidth=m_pImage->width;
	//	UpdateAllViews(NULL,0,0);
	}
	return TRUE;
}
视图初始化,设置滚动视图大小与图像大小一致,每次打开新文档自动建立视图,调用此函数
void CImageProcessView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();
	CImageProcessDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	CSize sizeTotal;
	// TODO: calculate the total size of this view
	sizeTotal.cx = pDoc->imageWidth;
	sizeTotal.cy = pDoc->imageHeight;
	SetScrollSizes(MM_TEXT, sizeTotal);
	
}

显示图像
void CImageProcessView::OnDraw(CDC* pDC)
{
	CImageProcessDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	if (pDoc->m_pImage!=NULL)//图像非空
	{
		StretchDIBits(pDC->m_hDC,0,0,pDoc->m_pImage->width,pDoc->m_pImage->height,
			
			0,pDoc->m_pImage->height,pDoc->m_pImage->width,-pDoc->m_pImage->height,
			
			pDoc->m_pImage->imageData,pDoc->lpbmi,
			
			DIB_RGB_COLORS,SRCCOPY);
	}

}





分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics