您的位置:首页 > 运维架构

MFC中采用分段线性对比度处理图像并且显示在控件中

2017-09-16 14:50 393 查看
功能:获取原图后,通过opencv相关函数对图像像素点进行对比度处理,然后在MFC的PictureControl中显示出来。

采用Opencv2.3.1,CvvImage类已经不在其中,需要额外增加,需要自行下载。

参数过多,更多实用算法可在此基础上开发。



头文件:

CvvImage m_CvvImage;
IplImage* m_Frame;
int m_X1;
int m_Y1;
int m_X2;
int m_Y2;


实现:

void XXX::OnBnClickedButtonSetContrast()
{
UpdateData(TRUE);
pDC=pStc->GetDC(); //得到Picture控件设备上下文
hDC=pDC->GetSafeHdc(); //得到控件设备上下文的句柄
int nRows = srcImage.rows;
int nCols = srcImage.cols;
Mat dstImage = srcImage.clone() ;//完全拷贝,把image中的所有信息拷贝到image1中
//判断图像的连续性
if (dstImage.isContinuous())
{
nCols = nRows*nCols;
nRows = 1;
}
uchar *pDataMat;
for( int j = 0; j < nRows; j++ )
{
pDataMat = dstImage.ptr<uchar>(j);//ptr<>()得到的是一行指针
for( int i = 0; i < nCols; i++ )
{
if (pDataMat[i]<=m_X1) pDataMat[i] = m_Y1 * pDataMat[i] / m_X1;
else if ( pDataMat[i]<=m_X2)  pDataMat[i] = (m_Y2-m_Y1)*( pDataMat[i]-m_X1)/(m_X2-m_X1) + m_Y1;
else  pDataMat[i] = (255-m_Y2)*( pDataMat[i]-m_X2)/(255-m_X2) + m_Y2;
if (pDataMat[i] < 0) pDataMat[i] = 0;
if (pDataMat[i] > 255) pDataMat[i] = 255;
}
}
imshow("原图", srcImage); //与效果图对比
Mat iMat(dstImage.rows, dstImage.cols, CV_8UC1, pDataMat, dstImage.cols);
m_Frame=&IplImage(iMat);
m_CvvImage.CopyOf(m_Frame);
m_CvvImage.DrawToHDC(hDC, &rect);
m_CvvImage.Destroy();
ReleaseDC( pDC );
UpdateData(FALSE);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MFC Opencv 对比度