最近一段时间使用OpenCV做图像处理,遇到了下面几个问题。

1.不使用OpenCV自动的void cvResize( const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR )函数,单纯的借助c++来实现图像的扩屏,例如将源图像放大到原来的1.7倍。我首先通过OpenCV函数读取图像,然后将源图像,创建的目标图像,源图像的宽和高作为参数,传给一个C++函数作为参数,在这个函数中实现将源图像放大到原来的1.7倍,在这个函数中不允许使用OpenCV中的任何函数,只能使用纯C++的语法,如何来完成该任务,请求大神指点。谢谢!

解决:取出来图像处理,单纯处理数据。

2.在上面那个处理过程中,经常会碰到一个令人头疼的问题,widthStep的值如何获取,因为每幅图像的widthStep值不一定一样,这个涉及到边界字节填充问题,目前我还没有找到合适的办法。如果不考虑widthstep,得出来的图像可能会有仿射变换,已经经过实验验证。

        有人可能会说IplImag指针结构里面本来就有widthStep值,但是我现在不能使用IplImag指针,要用纯C++,所以没有办法获取widthStep。

解决:对于灰度图像,如果width%4==0,则widthStep=width,如果除不净,widthStep则等于width-width%4+4

3.采用 Canny 算法做边缘检测
void cvCanny( const CvArr* image, CvArr* edges, double threshold1,double threshold2, int aperture_size=3 );
image  输入图像. 

edges 输出的边缘图像 

threshold1 第一个阈值
threshold2 第二个阈值
aperture_size        Sobel 算子内核大小 (见 cvSobel).

请问大牛这里面的阈值是什么含义?取值范围是多少?

这里的阈值是值梯度阈值,终于明白了。

4.OpenCV里面在使用语句cvSetMouseCallback("window_name", OnMouse); 调用onMouse函数为什么MFC会报错,

要求给OnMouse赋实参,因为定义void OnMouse的时候是有形参(int event,int x,int y,int flags,void *param)的。

可以使用OnLButtonDown、OnMouseMove和OnLButtonUp消息事件来解决该问题。

5.为什么在OnTimer事件中调用cvNamedWindow函数创建窗口时,窗口无法移动,程序报中断?

OnTimer和cvNameWindow属于两个线程,前一个线程未结束,后一个又发起了

6.从大幅图像中通过OnLButtonDown、OnMouseMove和OnLButtonUp消息事件获取ROI区域,如何将拉框的区域

拿出来?

int pos = 0,count = 0;
for(i=0; i<rect.height; i++)
{
pos = (rect.y+i) * m_iWidth + rect.x;
memcpy(&pImg->imageData[count],&pGray[pos],sizeof(BYTE)*step);
count = count + step;
}

7.如何消除光照对图像边缘的影响?

顶帽变换?

8.通过矩阵将彩色图像转化为灰度图像

pBuffer所指空间中存放着图像的数据

Mat gray;
Mat color(m_iWidth,m_iHeight,CV_8UC3,pBuffer);
cvtColor(color,gray,CV_RGB2GRAY); 9.如何实现Matlab中的AreaOpen功能,去除小面积区域
CvPoint* points = NULL;
CvMemStorage* storage = cvCreateMemStorage(0);
int method = CV_CHAIN_APPROX_SIMPLE;
int mode = CV_RETR_EXTERNAL;
CvSeq* contours = NULL;
int Nc = 0;
int n_mMax = -1;Nc = cvFindContours( pImg, storage, &contours, sizeof(CvContour),mode, method);

for(; contours; contours=contours->h_next)
{
if(contours->total > n_mMax)
{
free(points);
points = NULL;
n_mMax = contours->total;
points = (CvPoint*)malloc(contours->total * sizeof(CvPoint));

for(i=0; i<contours->total; i++)
{
CvPoint* pt = (CvPoint*)cvGetSeqElem(contours,i);
points[i].x = pt->x;
points[i].y = pt->y;
}
}
else
{
continue;
}
}

10. 最近有个很郁闷的问题,有两个标准圆,一个1.4mm,另一个0.4mm,在1.0倍率 下测,0.4的与真值只差10um左右,而1.4的要差30um,有哪位高人知道什么原因吗?
说通俗点就是:小圆能测准,大圆测不准 


 


11.当灯光变化时,获取的圆大小发生变化:


当灯光变强时,获取的白圆变大,黑圆变小;


当灯光变弱时,获取的白圆变小,黑圆变大;


通俗点:如何消除灯光对圆大小的影响


备注:我是通过鼠标事件获取动态的图像。



12.在亚像素级用什么方法进行圆拟合精度比较好?



13.函数声明为f(double* a,double* b),已经写成dll,无法改变,是通过库来调用的。c,d是double类型的vector向量,在调用时输入f(c,d),编译时提示无法将vector类型


向量转为double*,我写出f(c._Myfirt,c._Myfirst);后,总感觉数据不稳定,不知道什么原因。


     个人理解,vector就是一个动态向量,是不是刚开始分配了一部分内存,后来发现内存不够了又重新分配了内存,从而导致首地址发生了变换,即._Myfirst发生了变换?


 


14.如何将图像边缘定位到像素级别?


 


15.如何消除光晕现象?


 


16.如何消除动态图像的拖尾?


 


17.使用cvShowImage显示小图片时,右侧出现灰色空白区域,如何去除?


 


18.Mat和IplImage结构如何转换?


19.如何计算整幅图像的对比度?