采集得到的图像,使用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);
}
经过这样的程序的到的图像就是斜直线,没有一点原图像的样子。郁闷好几天了,恳请帮助。
不胜感激!
为了把这个圆形区域取出来,没有函数可以使用,只能对各个像素进行判断。那么,我要怎么把图像缓存区的图像存储到一个二维数组然后使用二维数组对各个像素进行判断呢???? 我找到了如下代码,对二维数组进行赋值,但是使用的时候出错。大家有什么容易点的方法吗????
先谢谢各位高手了、、、
//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
关于利用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);
}
经过这样的程序的到的图像就是斜直线,没有一点原图像的样子。郁闷好几天了,恳请帮助。
不胜感激!
解决方案 »
- 求教:MFC中list control中加载图标
- CRichEdit怎样禁止拖动功能啊!!
- 在线等待:问一个简单的问题:怎么让CRichEdit控件可以用CTRL+C,CTRL+V,CTRL+X
- 那里有关于TCP/IP的电子文档?
- 哪个大虾知道怎么把一个*.dll的文件转换为*.lib?
- 已经知道数据的地址和长度,怎么在视图中显示出来?
- 新手问个简单问题,在线等待。
- 高分求解(100)
- CStringArray的问题
- 为什么不能通过class wizzard实现重载了mfc格式的CSplitterWnd类?
- 工具栏删除了怎么恢复
- 我想在CTreeCtrl控件中加载不同大小的图片。就像QQ的面板,“我的好友”、“陌生人”、“黑名单”前面的图片都比较小,而好友头像的图片都要大很多。如何同时加载不同大小图片?
这个问题已经解决了
不过你的方法比我的简单
我加你q了,可以一起讨论,毕竟用mil的人应该也不多