OpenCV打开和显示图像

来源:互联网 发布:知乎的海贼 王路飞 编辑:程序博客网 时间:2024/05/22 01:47

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

doc类添加变量

public:int ReadImage(LPCTSTR lpszPathName);int imageWidth,imageHeight;//滚动视图大小BITMAPINFO * lpbmi;//bmp显示缓存,必需IplImage* m_pImage;//图像指针
变量初始化
CImageProcessDoc::CImageProcessDoc(){// TODO: add one-time construction code herem_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 viewsizeTotal.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 hereif (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);}}


原创粉丝点击