图像处理小结2

来源:互联网 发布:电脑校色软件 编辑:程序博客网 时间:2024/06/06 09:12

1.

CvvImage类在opencv2.2之后已经被删掉了。

重回opencv1.0怀抱。

2.

GetClientRect(); //获得client区域
GetWindowRect(); //获取window区域
ScreenToClient(); //window区域向客户区域坐标转换

GetClientRect()获得的区域是自己的框,得到的rect的left,top必然为0
而GetWindowRect();获得的区域包括位置,是真个屏幕的位置。

获得控件在客户区的相对坐标的正确方法:
CRect rt;
GetWindowRect(&rt); //获得window区域
ScreenToClient(&rt); //转到client
3.

图片加载到控件上会改变尺寸,不能按照之前的图像尺寸进行画线等操作,否则会出现偏差。

可以以控件本身的尺寸进行lineto和moveto操作。

 CDC *pDC = GetDlgItem(IDC_STATIC_PIC)->GetDC();//由控件ID获得控件句柄,再由控件句柄获得显示控件的DC
   HDC hDC = pDC->GetSafeHdc();//由控件的DC获取 HDC(DC的句柄) 来进行绘图操作

   CPoint P1;
   CPoint P2;
   P1.x=point1.x;
   P1.y=point1.y;
   P2.x=point2.x;
   P2.y=point1.y;
   CvScalar color=CV_RGB(0,255,0);      
   pDC->MoveTo(P1);
   pDC->LineTo(P2);

4.将之前框住的部分copy到另外一个图片控件上单独显示.

 计算出原图像和控件之间的长宽比例。

 将控件上的坐标除以相应的比例进行像素复制。

 需要注意的是,vc6.0里的控件和图像的起始位置都在左上角。

 double bili_x=(DOUBLE)rect.right/(double)img->width;//获得x方向的伸缩比例
 double bili_y=(DOUBLE)rect.bottom/(DOUBLE)img->height;//获得y方向的伸缩比例
 CvSize size;//获得实际抠图尺寸
 size.height=(int)((double)(point2.y-point1.y)/bili_y);
 size.width=(int)((double)(point2.x-point1.x)/bili_x);

 img4=cvCreateImage(size, img->depth, img->nChannels);//创建新图像,新图像赋值

 img4->imageData[(i)*img4->widthStep+(j)*img4->nChannels+k]=img->imageData[(int)(i+(point1.y)/bili_y)*img->widthStep+(int)(j+(point1.x)/bili_x)*img->nChannels+k];
原创粉丝点击