图像处理步骤

来源:互联网 发布:qq mac版支持哪个系统 编辑:程序博客网 时间:2024/04/28 07:43
在stdafx.h里
打开 #define SELF_ANALY宏定义,可以知道数据原始操作


即可以知道一般图像处理步骤为


原始图片--> 灰度处理 ----> 边缘化


R,G,B   --->Gray = R*0.299 + G*0.587 + B*0.114  ---->将所有的图像数据变成 0或0xff(可以称为开关量)




void CopImgDlg::OnBnClickedButtonPregray()
{
// TODO: 在此添加控件通知处理程序代码
if(pSrcImg) 
cvReleaseImage(&pSrcImg);
pSrcImg = cvLoadImage("test.bmp"); //显示图片
if(pSrcImg)
{
debug_printf("open ok!\r\n");
#ifndef SELF_ANALY
CRect rect;
int cx,cy;
cx = pSrcImg->width;
cy = pSrcImg->height;


GetDlgItem(IDC_STATIC_CV)->GetWindowRect(&rect);  //相对srceen坐标值
// debug_printf("left=%d\r\n",rect.left);
// debug_printf("top=%d\r\n",rect.top);
// debug_printf("width=%d\r\n",rect.right-rect.left);
// debug_printf("height=%d\r\n",rect.bottom-rect.top);

ScreenToClient(&rect);   //相对于对话框的坐标值

// debug_printf("left=%d\r\n",rect.left);
// debug_printf("top=%d\r\n",rect.top);
// debug_printf("width=%d\r\n",rect.right-rect.left);
// debug_printf("height=%d\r\n",rect.bottom-rect.top);

GetDlgItem(IDC_STATIC_CV)->MoveWindow(rect.left,rect.top,cx,cy,true);//调整大小


CDC *pDC = GetDlgItem(IDC_STATIC_CV)->GetDC();
HDC hDC= pDC->GetSafeHdc();
GetDlgItem(IDC_STATIC_CV)->GetClientRect(&rect);   //相对于控件坐标值
debug_printf("left=%d\r\n",rect.left);
debug_printf("top=%d\r\n",rect.top);
debug_printf("width=%d\r\n",rect.right-rect.left);
debug_printf("height=%d\r\n",rect.bottom-rect.top);


CvvImage cimg;
cimg.CopyOf(pSrcImg); // 复制图片
cimg.DrawToHDC(hDC,&rect); // 将图片绘制到显示控件的指定区域内
ReleaseDC(pDC);
#else   //自己的取数据画图


CRect rect;
int cx,cy;
cx = pSrcImg->width;
cy = pSrcImg->height;

GetDlgItem(IDC_STATIC_CV)->GetWindowRect(&rect);  //相对srceen坐标值
ScreenToClient(&rect);   //相对于对话框的坐标值
GetDlgItem(IDC_STATIC_CV)->MoveWindow(rect.left,rect.top,cx,cy,true);//调整大小



   CWnd *pWnd;
CDC *pDC;


pWnd=GetDlgItem(IDC_STATIC_CV); 
pDC=pWnd->GetDC();
pWnd->Invalidate(); 
pWnd->UpdateWindow();



CPoint picPoint;
CRect picRect;
LONG picWidth,picHeigt;


pWnd->GetClientRect(&picRect);


picWidth=(picRect.right-picRect.left);
picHeigt=(picRect.bottom-picRect.top);
picPoint.x = 0;
picPoint.y = 0;

int i,j;
int widBytes;
widBytes=pSrcImg->widthStep;
debug_printf("width : %d \r\n",pSrcImg->width);
debug_printf("height : %d \r\n",pSrcImg->height);
debug_printf("widBytes : %d \r\n",widBytes);

BYTE *ptr = new BYTE[widBytes];
for(i=0;i<pSrcImg->height;i++)
{

pDC->MoveTo(picPoint);
memcpy(ptr,pSrcImg->imageData+i*widBytes,widBytes);
if(i == (pSrcImg->height/2))
debug_printf("dat : %d  %d  %d \r\n",ptr[0],ptr[1],ptr[2]);
for(j=0;j<pSrcImg->width;j++)
{




pDC->SetPixel(picPoint,RGB(ptr[j*3+2],ptr[j*3+1],ptr[j*3]));



picPoint.x ++;
}
picPoint.x = 0;
picPoint.y ++;


}



pWnd->ReleaseDC(pDC);
delete[] ptr;
#endif

}
else
{
debug_printf("open failed!\r\n");
}
}




void CopImgDlg::OnBnClickedButtonGray()
{
// TODO: 在此添加控件通知处理程序代码
if(!pSrcImg)
return;
//将颜色空间由RGB转化为Gray
pGrayImg=cvCreateImage(cvGetSize(pSrcImg),IPL_DEPTH_8U,1);
cvCvtColor(pSrcImg,pGrayImg,CV_RGB2GRAY);
#ifndef SELF_ANALY
CRect rect;

CDC *pDC = GetDlgItem(IDC_STATIC_CV)->GetDC();
HDC hDC= pDC->GetSafeHdc();
GetDlgItem(IDC_STATIC_CV)->GetClientRect(&rect);
CvvImage cimg;
cimg.CopyOf(pGrayImg); // 复制图片
cimg.DrawToHDC(hDC,&rect); // 将图片绘制到显示控件的指定区域内
ReleaseDC(pDC);
#else  //自己的取数据画图

   CWnd *pWnd;
CDC *pDC;


pWnd=GetDlgItem(IDC_STATIC_CV); 
pDC=pWnd->GetDC();
pWnd->Invalidate(); 
pWnd->UpdateWindow();



CPoint picPoint;
CRect picRect;
LONG picWidth,picHeigt;


pWnd->GetClientRect(&picRect);


picWidth=(picRect.right-picRect.left);
picHeigt=(picRect.bottom-picRect.top);
picPoint.x = 0;
picPoint.y = 0;

int i,j;
int widBytes;
widBytes=pGrayImg->widthStep;
debug_printf("width : %d \r\n",pGrayImg->width);
debug_printf("height : %d \r\n",pGrayImg->height);
debug_printf("widBytes : %d \r\n",widBytes);

BYTE *ptr = new BYTE[widBytes];
for(i=0;i<pGrayImg->height;i++)
{

pDC->MoveTo(picPoint);
memcpy(ptr,pGrayImg->imageData+i*widBytes,widBytes);
if(i == pGrayImg->height/2)
debug_printf("dat : %d  %d  %d \r\n",ptr[0],ptr[1],ptr[2]);

for(j=0;j<pGrayImg->width;j++)
{



pDC->SetPixel(picPoint,RGB(ptr[j],ptr[j],ptr[j]));



picPoint.x ++;
}
picPoint.x = 0;
picPoint.y ++;


}

pWnd->ReleaseDC(pDC);
delete[] ptr;
#endif
}




void CopImgDlg::OnBnClickedButtonCanny()
{
// TODO: 在此添加控件通知处理程序代码
if(!pGrayImg)
return;
pCannyImg = cvCreateImage(cvGetSize(pGrayImg),IPL_DEPTH_8U,1);
cvCanny(pGrayImg, pCannyImg,(float)Thresh,(float)Thresh*3, 3);
#ifndef SELF_ANALY
CRect rect;

CDC *pDC = GetDlgItem(IDC_STATIC_CV)->GetDC();
HDC hDC= pDC->GetSafeHdc();


GetDlgItem(IDC_STATIC_CV)->GetClientRect(&rect);
CvvImage cimg;
cimg.CopyOf(pCannyImg); // 复制图片
cimg.DrawToHDC(hDC,&rect); // 将图片绘制到显示控件的指定区域内
ReleaseDC(pDC);
#else  //自己的取数据画图

   CWnd *pWnd;
CDC *pDC;


pWnd=GetDlgItem(IDC_STATIC_CV); 
pDC=pWnd->GetDC();
pWnd->Invalidate(); 
pWnd->UpdateWindow();



CPoint picPoint;
CRect picRect;
LONG picWidth,picHeigt;


pWnd->GetClientRect(&picRect);


picWidth=(picRect.right-picRect.left);
picHeigt=(picRect.bottom-picRect.top);
picPoint.x = 0;
picPoint.y = 0;

int i,j;
int widBytes;
widBytes=pCannyImg->widthStep;
debug_printf("width : %d \r\n",pCannyImg->width);
debug_printf("height : %d \r\n",pCannyImg->height);
debug_printf("widBytes : %d \r\n",widBytes);

BYTE *ptr = new BYTE[widBytes];
for(i=0;i<pCannyImg->height;i++)
{


debug_printf("\r\ndat : ");
pDC->MoveTo(picPoint);
memcpy(ptr,pCannyImg->imageData+i*widBytes,widBytes);
// if(i == pCannyImg->height/2)
// debug_printf("dat : %d  %d  %d \r\n",ptr[0],ptr[1],ptr[2]);
for(j=0;j<pCannyImg->width;j++)
{


debug_printf(" %x",ptr[j]);
pDC->SetPixel(picPoint,RGB(ptr[j],ptr[j],ptr[j]));



picPoint.x ++;
}
picPoint.x = 0;
picPoint.y ++;


}

debug_printf("\r\n");


pWnd->ReleaseDC(pDC);
delete[] ptr;
#endif
}