解决HALCON中的分割显示问题[引用]
(2009-11-16 23:27:56)
标签:
it |
分类: 工作类 |
来自http://www.china-vision.net/blog/user1/8/archives/2007/1040.html
今天终于解决了困扰我很久的一个问题,在VC中调用HALCON中的分割函数后,在最后返回显示时总是报错,让我郁闷了很久,Undefined gray in get_image_pointer3 或Undefined gray in get_image_pointer。
1. region_to_bin(Region,BinImage,ForegroundGray,BackgroundGray,Width,Height)它将一个区域转化成一个二进制字节图像。给区域内的所有像素赋给前景灰度值,如果输入区域大于生成的图像,则会在图像边界处截断;
2. region_to_label(Region,ImageLabel,Type,Width,Height)它将区域转化为一个标签图像,通过索引值:第一个区域赋予灰度值1,第二个区域赋予灰度值2,依此类推……这里仅仅使用正的灰度值,直到256。区域大于生成图像则会被适当地截断。如果区域重叠,则较高值的图像会被输出。如果想重叠,可以调用expand_region进行处理。Type='int2'、'int4'、‘byte'
3. region_to_mean(Regions,Image,ImageMean)用它们的均值来填充图像区域,返回Image。这个操作符主要用来可视化分割结果(正是我想要的^_^)
针对256色灰度图像,只是截取主要部分程序,其他只是打开一幅图像,将图像数据放到m_pImageBuffer中。
char
Type[MAX_STRING];
gen_image1(&hImage,"byte",width,height,(long)m_pImageBuffer);
//将缓冲区的数据生成一幅Image
threshold(hImage,&Region,160,255);
//对Image进行阈值分割
connection(Region,&ConnectedRegions);
//将小区域连接成一个大区域
region_to_mean(ConnectedRegions,hImage,&ImageMean);
//转化为Image
get_image_pointer1(ImageMean,(long*)&m_pRed,Type,&width1,&height1);
//从HALCON的Image中获得处理后的图像数据
for(i=size-1,j=0;i>=0;i--,j++)
针对24位RGB图像
ExtractRGB24Channels(m_pImageBuffer,m_pRed,m_pGreen,m_pBlue);
//从打开的图像数据中分别提取出R、G、B分量,用于生成HALCON的Image
gen_image3(&hImage,"byte",width,height,(long)m_pRed,(long)m_pGreen,(long)Blue);
//获得Image
threshold(hImage,&Region,160,255);
//对Image进行阈值分割
connection(Region,&ConnectedRegions);
//将小区域连接成一个大区域
region_to_mean(ConnectedRegions,hImage,&ImageMean);
//转化为Image
get_image_pointer3(ImageMean,(long*)&m_pRed,(long*)&m_pGreen,(long*)&m_pBlue,Type,&width1,&height1);
//从ImageMean中获得R、G、B三个分量的像素值
ComposeRGB24(m_pRed,m_pGreen,m_pBlue,m_pImageBuffer);
//将处理后的图像数据放到buffer中,返回显示处理结果
附:
//从24位位图数据中提取红、绿、蓝三个分量
BOOL CTest1Doc::ExtractRGB24Channels(BYTE *data, BYTE *pRed, BYTE *pGreen, BYTE *pBlue)
{
int i,j,size;
size = width*height;
for (i=size-1,j=0; i>= 0;
i--,j+=3)
{
pBlue[i] = data[j];
}
for (i=size-1,j=1; i>=0;
i--,j+=3)
{
pGreen[i] = data[j];
}
for (i=size-1,j=2; i>=0;
i--,j+=3)
{
pRed[i] = data[j];
}
return TRUE;
}
BOOL CTest1Doc::ExtractRGB24Channels(BYTE *data, BYTE *pRed, BYTE *pGreen, BYTE *pBlue)
{
}
//将红、绿、蓝三个分量合成24位位图数据
BOOL CTest1Doc::ComposeRGB24(BYTE *pRed, BYTE *pGreen, BYTE *pBlue, BYTE *data)
{
int i,j,size;
size = width*height;
for (i=size-1,j=0; i>= 0;
i--,j+=3)
{
data[j] = pBlue[i];
}
for (i=size-1,j=1; i>=0;
i--,j+=3)
{
data[j] = pGreen[i];
}
for (i=size-1,j=2; i>=0;
i--,j+=3)
{
data[j] = pRed[i];
}
return TRUE;
}
BOOL CTest1Doc::ComposeRGB24(BYTE *pRed, BYTE *pGreen, BYTE *pBlue, BYTE *data)
{
}
前一篇:明天要做甲流疫苗的白老鼠了
后一篇:电影2012参观记