版权声明:欢迎转载与留言提问 https://blog.csdn.net/qq_25439417/article/details/82113993
Intptr bmptr = bitmap.scan0;
byte[] bm = new byte[]
Marshal.Copy(bmptr,bm,0,bmlength);
以上是获取图像的位图的指针与字节数组对象的伪代码
之后对BM即图像数组进行操作即可。
在我的项目中,采集图像与显示和二值化方法如下所示
IntPtr pBufferMono = IntPtr.Zero;
if (__IsPixelFormat8(objIBaseData.GetPixelFormat()))
{
pBufferMono = objIBaseData.GetBuffer();
}
else
{
pBufferMono = objIBaseData.ConvertToRaw8(emValidBits);
}
int len = __GetStride(m_nWidth, m_bIsColor) * m_nHeigh;
Marshal.Copy(pBufferMono, m_byMonoBuffer, 0, len);
Console.WriteLine(len);
int max = 0;
int maxindex = 0;
int min = len;
int minindex = 0;
int[] huidutu = new int[256];
for (int i = 0; i < len; i++) {
int gray = m_byMonoBuffer[i];
//Console.WriteLine(gray);
huidutu[gray]++;
}
for (int i = 0; i < 255; i++) {
if (huidutu[i] > max )
{
max = huidutu[i];
maxindex = i;
}
}
for (int i = 0; i < 255; i++)
{
if (huidutu[i] < min)
{
min = huidutu[i];
minindex= i;
}
}
Console.WriteLine("结束了一波:最小灰度:"+min+" 最小灰度index:"+minindex+":最大灰度:"+max+" 最大灰度index:"+maxindex);
//minindex -->灰度阈值 做二值化分割
for (int i = 0; i < len; i++)
{
if (m_byMonoBuffer[i] < minindex)
{
m_byMonoBuffer[i] = 0;
}
else
{
m_byMonoBuffer[i] = 255;
}
}
完全版,做了初始化 瞳孔区域观测,与后期固定区域探测
//初始化 瞳孔范围
int leftwidth = 0;
int rightwidth = 0;
int upheight = 0;
int downheight = 0;
int initnum = 0;
int range = 0;
Boolean inithuiduflag = false;
Boolean initpointflag = false;
/// <summary>
/// 用于显示图像
/// </summary>
/// <param name="objIBaseData">图像数据对象</param>
public void Show(IBaseData objIBaseData)
{
GX_VALID_BIT_LIST emValidBits = GX_VALID_BIT_LIST.GX_BIT_0_7;
//检查图像是否改变并更新Buffer
__UpdateBufferSize(objIBaseData);
if (null != objIBaseData)
{
emValidBits = __GetBestValudBit(objIBaseData.GetPixelFormat());
if (GX_FRAME_STATUS_LIST.GX_FRAME_STATUS_SUCCESS == objIBaseData.GetStatus())
{
if (m_bIsColor)
{
IntPtr pBufferColor = objIBaseData.ConvertToRGB24(emValidBits, GX_BAYER_CONVERT_TYPE_LIST.GX_RAW2RGB_NEIGHBOUR, false);
Marshal.Copy(pBufferColor, m_byColorBuffer, 0, __GetStride(m_nWidth, m_bIsColor) * m_nHeigh);
__ShowImage(m_byColorBuffer);
}
else
{
IntPtr pBufferMono = IntPtr.Zero;
if (__IsPixelFormat8(objIBaseData.GetPixelFormat()))
{
pBufferMono = objIBaseData.GetBuffer();
}
else
{
pBufferMono = objIBaseData.ConvertToRaw8(emValidBits);
}
int len = __GetStride(m_nWidth, m_bIsColor) * m_nHeigh;
Marshal.Copy(pBufferMono, m_byMonoBuffer, 0, len);
int max = 0;
int maxindex = 0;
int min = len;
int minindex = 0;
//Console.WriteLine(len);
//如果第一次初始化,那么求得minindex,找到波谷做分割,后面则不再做此操作
if (inithuiduflag == false && initpointflag == false)
{
int[] huidutu = new int[256];
for (int i = 0; i < len; i++)
{
int gray = m_byMonoBuffer[i];
//Console.WriteLine(gray);
huidutu[gray]++;
}
for (int i = 0; i < 100; i++)
{
if (huidutu[i] > max)
{
max = huidutu[i];
maxindex = i;
}
}
for (int i = 0; i < maxindex; i++)
{
if (huidutu[i] < min)
{
min = huidutu[i];
minindex = i;
}
}
}
//minindex -->灰度阈值 做二值化分割
int whitenum = 0;
int xsum = 0;
int ysum = 0;
if (inithuiduflag == true) {
len = downheight * m_nWidth + leftwidth + 2 * range;
}
Console.WriteLine("结束了一波:最小灰度:" + min + " 最小灰度index:" + minindex + ":最大灰度:" + max + " 最大灰度index:" + maxindex+" 长度:"+len);
for (int i = upheight*m_nWidth+leftwidth; i < len; i++)
{
//小于阈值的部分,置为1,让其成为白色,置为1的目的是为了更好的做 图像质点 求取,因为瞳孔部分少,所以1更少,从1求质心计算量小
if (m_byMonoBuffer[i] <= minindex)
{
m_byMonoBuffer[i] = 1;
whitenum++;
//图像是 m_nHeigh* m_nWidth
xsum = xsum + i % m_nWidth;
ysum = ysum + i / m_nWidth;
}
//小于阈值的部分,置为0,让其成为黑色,置为0的目的是为了更好的做 图像质点 求取
else
{
m_byMonoBuffer[i] = 0;
}
}
ArrayList pointlist = new ArrayList();
int[] pointindex = new int[2];
pointindex[0] = xsum / whitenum;
pointindex[1] = ysum / whitenum;
//初始化 下一次检测区域
if (initpointflag == false)
{
range = 100;
leftwidth = pointindex[0] - range;
rightwidth = pointindex[0] + range;
upheight = pointindex[1] - range;
downheight = pointindex[1] + range;
if (leftwidth < 0)
leftwidth = 0;
if(rightwidth>m_nWidth)
rightwidth=m_nWidth;
if (upheight < 0)
upheight = 0;
if (downheight > m_nHeigh)
downheight = m_nHeigh;
//如果初始化成功
initpointflag = true;
inithuiduflag = true;
Console.WriteLine("init succ");
}
pointlist.Add(pointindex);
__ShowImage(m_byMonoBuffer);
}
}
}
}