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];