本文介绍在MFC框架下,使用opencv的解码函数对图片进行解码,并最终显示到窗口。在此过程中,遇到了图片显示时的大小问题,以及闪烁问题,本文将一一解决。
【显示图片】
1. 在CImageProcessView::OnDraw(CDC* pDC) 中写绘制图片的代码
我们已经打开图片时,利用opencv对图片文件进行了解码,图像数据已经在src_image中持有,现在需要把src_image中的数据绘制到窗口。
void CImageProcessView::OnDraw(CDC* pDC)
{
CImageProcessDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: add draw code for native data here
Mat & image = pDoc->src_image;
}
2. 将Mat转化成CImage
Mat是表示图像数据的一个矩阵,它不能直接绘制到窗口DC,通过google,我发现atl的一个类CImage有绘制到DC的方法,所以只需要把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();
int step = cImage.GetPitch();
for (int i = 0; i < height; ++i)
{
ps = (mat.ptr(i));
for ( int j = 0; j < width; ++