关于利用VC,实现图象采集程序的问题!!!急!!!
问题
我的工作的主要目的是对一个实时采集的图像(图像主要是个零件)进行处理分析,找出其中心位置和角度,然后让机械手去抓取,应该算是一个简单的视觉系统。
要找到零件的中心必须找到边缘,所以要边缘检测。我想采取这样四个步骤:滤波,增强,检测,定位。现在我没有对那个零件的图像检测,想先在随便的图像上实验各个算子,然后才到实验室里试验。在vc++中实现,采用Matrox公司的图像采集卡。比如实时采集到的图像如下:(我在vc++中结合图像采集卡函数实现的)
具体程序如下:
/*头文件,其中<mil.h>是图像采集卡本身的头文件*/
#include <stdio.h>
#include <mil.h>
#include <iostream.h>
#include <math.h>
#define MAX_DEPTH 8
void main(void)
{
/*定义各种参数类型,包括图像采集卡本身的类型,这些都没有什么关系,不影响程序的阅读*/
MIL_ID MilApplication,
MilSystem,
MilDisplay,
MilImage,
MilDigitizer,
MilImage1;
long ImageSizeX,ImageSizeY,ImagePitch,x,y,lastvel,sum=0;
unsigned char *ImageDataPtr;
long a[640][480],b[640][480],c[640][480],d[640][480];
/*设置缺省的应用,初始化 */
MappAllocDefault(M_COMPLETE, &MilApplication, &MilSystem,
&MilDisplay,&MilDigitizer,&MilImage);
MbufAlloc2d(MilSystem,640,480,8+M_UNSIGNED,M_IMAGE+M_DISP,&MilImage1);
/* 抓取图像在缓冲区MilImage 里*/
MdigGrabContinuous(MilDigitizer, MilImage);
getchar();
/*停止抓取*/
MdigHalt(MilDigitizer);
printf("Reference image was grabed, press a key to continue.\n");
getchar();
/* 处理图像,把图像中的各个像素数存在数组a[x][y]中,这一步没有什么问题,都能把实际的像素数保存在数组中*/
if(MbufInquire(MilImage,M_SIZE_BIT,M_NULL)==MAX_DEPTH)
MbufInquire(MilImage,M_HOST_ADDRESS,&ImageDataPtr);
MbufInquire(MilImage,M_SIZE_X,&ImageSizeX);
MbufInquire(MilImage,M_SIZE_Y,&ImageSizeY);
MbufInquire(MilImage,M_PITCH,&ImagePitch);
for(y=0;y<ImageSizeY;y++)
{
for(x=0;x<ImageSizeX;x++)
{
a[x][y]=(long)ImageDataPtr[x];
}
ImageDataPtr+=ImagePitch;
}
/*对每个元素进行简单的Roberts增强,(事先没有滤波,但是我想这不应该影响检测,顶多检测出其他的不需要边缘,实际操作时我会滤波的),也尝试过其他的算子,都不好用。就是经过算子以后图像的像素值没有什么规律,不象书上说的那样,在边缘处很分明*/
for(y=0;y<479;y++)
for(x=0;x<639;x++)
{
/* b[x][y] 和c[x][y]是Roberts算子增强后的矩阵,边缘的一行一列忽略掉。*/
b[x][y]=a[x][y]-a[x+1][y+1];
c[x][y]=a[x][y+1]-a[x+1][y];
/*取平方后开根号值为检测后得到的值*/
d[x][y]=sqrt(b[x][y]*b[x][y]+c[x][y]*c[x][y]);
/* sum用来存放经过算子处理后的新像素和,以便求平均值作为阈值*/
sum=sum+d[x][y];
}
lastvel=sum/(639*479); /*求平均值*/
for(y=0;y<479;y++)
for(x=0;x<639;x++)
{
/*如果大于平均值,就在缓冲区MilImage1中画一个点,这个是图像采集卡所带函数*/
if (d[x][y]>=lastvel)
MgraDot(M_DEFAULT,MilImage1,x,y);
}
MdispSelect(MilDisplay, MilImage1); /*显示缓冲区MilImage1*/
getchar();
/* 释放内存. */
MbufFree(MilImage1);
MappFreeDefault(MilApplication, MilSystem, MilDisplay,MilDigitizer, MilImage);
}
经过这样的程序的到的图像就是斜直线,没有一点原图像的样子。郁闷好几天了,恳请帮助。
不胜感激!