采集得到的图像,使用mil函数库已经保存在一个图像缓存区里面,可以使用函数库的函数进行一些处理,但是现在我需要的功能是获取图像上某点为圆心的某个区域来进行斑点分析,而斑点分析部分的函数没有这样的功能。只好先把这部分区域取出来,然后对整个图像来进行斑点分析。 
    为了把这个圆形区域取出来,没有函数可以使用,只能对各个像素进行判断。那么,我要怎么把图像缓存区的图像存储到一个二维数组然后使用二维数组对各个像素进行判断呢????     我找到了如下代码,对二维数组进行赋值,但是使用的时候出错。大家有什么容易点的方法吗???? 
    先谢谢各位高手了、、、 
////////////////////////////////////////////////////////////////////////////////////////////// 
////////////////////////////////////////////////////////////////////////////////////////////// 
////////////////////////////////////////////////////////////////////////////////////////////// 
////////////////////////////////////////////////////////////////////////////////////////////// 
关于利用VC,实现图象采集程序的问题!!!急!!!楼主zhucanfly(小猪哥哥)2004-04-06 07:26:29 在 C/C++ / C++ 语言 提问 
问题  
  我的工作的主要目的是对一个实时采集的图像(图像主要是个零件)进行处理分析,找出其中心位置和角度,然后让机械手去抓取,应该算是一个简单的视觉系统。  
  要找到零件的中心必须找到边缘,所以要边缘检测。我想采取这样四个步骤:滤波,增强,检测,定位。现在我没有对那个零件的图像检测,想先在随便的图像上实验各个算子,然后才到实验室里试验。在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);  
  }  
    
  经过这样的程序的到的图像就是斜直线,没有一点原图像的样子。郁闷好几天了,恳请帮助。  
  不胜感激!