求提取目标轮廓的方法
解决方案 »
- 请教:对话框在任务栏里显示隐藏,如何实现?
- 如何使用导出类的静态常量?
- VC中如何将2张或者2张以上的BMP图片叠加在一起?而且是透明叠加??
- 关于一个大学生是否违约的问题?请你关注。。。。。。。。。。
- 能否把一个dll再封一层形成一个新的dll?
- 请教,遇到过编译后要指定一个执行文件吗?
- 如何使一个 ListCtrl 滚动?
- rundll32的诡异问题,来看看吧,有没有遇到过的?
- 调用API ExitWindowExt(EWX_POWEROFF,0)为何关不了机器?
- 请问:哪里有htmlhelp的使用资料啊?
- 怎么替换消息,比如说点鼠标右键时替换成左键
- 搞过modem编程的大哥们请指教啊(关于TAPI)(300分求教)
/*************************************************************************
*
* 函数名称:
* Roberts()
*
* 参数:
* HDIB hDIB - 待处理的DIB
*
* 返回值:
* void - 无返回值
*
* 说明:
* 对图像进行罗伯特交叉算子的边缘检测
*
************************************************************************/void CSplitProc::Roberts(HDIB hDIB)
{
// 循环变量
LONG i;
LONG j;
LONG k;
LONG l;
// 指向DIB的指针
LPBYTE lpDIB;
// 指向DIB象素指针
LPBYTE lpDIBBits;
// 锁定DIB
lpDIB = (LPBYTE) ::GlobalLock((HGLOBAL) hDIB); // 找到DIB图像象素起始位置
lpDIBBits = m_clsDIB.FindDIBBits(lpDIB);
// 判断是否是24-bpp位图
if (m_clsDIB.DIBBitCount(lpDIB) != 24)
{
// 提示用户
MessageBox("请先将其转换为24位色位图,再进行处理!", "系统提示" , MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL) hDIB);
// 返回
return;
}
// 更改光标形状
BeginWaitCursor();
// DIB的宽度
LONG lWidth = m_clsDIB.DIBWidth(lpDIB);
// DIB的高度
LONG lHeight = m_clsDIB.DIBHeight(lpDIB);
// 计算图像每行的字节数
LONG lLineBytes = WIDTHBYTES(lWidth * 24); // 不能用char,也不能用::strcpy()
unsigned char* m_temp;
m_temp = new unsigned char [lLineBytes * lHeight]; // 中间变量
int v_r_v, v_g_v, v_b_v, g_v;
int v_r_h, v_g_h, v_b_h, g_h; // 复制图象数据到中间缓存
for (i = 0; i < lLineBytes * lHeight; i++)
m_temp[i] = *(lpDIBBits + i); // 2X2 模版
for (i = 0; i < lWidth; i++) //被处理像素在i列
{
for (j = 0; j < lHeight; j++) //被处理像素在j行
{
v_r_v = v_g_v = v_b_v = v_r_h = v_g_h = v_b_h = 0;
for (k = i - 1; k < i + 1; k++) //2*2模版
{
for (l = j - 1; l < j + 1; l++)
{
// 防止内存溢出
if (k >= 0 && l >= 0 && k < lWidth && l < lHeight)
{
// 检测模版
if (k == i - 1 && l == j - 1)
g_v = 1;
else if (k == i && l == j)
g_v = -1;
else
g_v = 0; if(k == i - 1 && l == j)
g_h = -1;
else if (k == i && l == j - 1)
g_h = 1;
else
g_h = 0;
v_r_v += *(lpDIBBits + l * lLineBytes + k * 3) * g_v;
v_r_h += *(lpDIBBits + l * lLineBytes + k * 3) * g_h;
v_g_v += *(lpDIBBits + l * lLineBytes + k * 3 + 1) * g_v;
v_g_h += *(lpDIBBits + l * lLineBytes + k * 3 + 1) * g_h;
v_b_v += *(lpDIBBits + l * lLineBytes + k * 3 + 2) * g_v;
v_b_h += *(lpDIBBits + l * lLineBytes + k * 3 + 2) * g_h;
}
}
}
m_temp[j * lLineBytes + i * 3] = (int)sqrt(v_r_v * v_r_v + v_r_h * v_r_h);
m_temp[j * lLineBytes + i * 3 + 1] = (int)sqrt(v_g_v * v_g_v + v_g_h * v_g_h);
m_temp[j * lLineBytes + i * 3 + 2] = (int)sqrt(v_b_v * v_b_v + v_b_h * v_b_h);
}
} // 回存处理结果到DIB
for(i = 0; i < lLineBytes * lHeight; i++)
*(lpDIBBits + i) = m_temp[i]; // 解除锁定
::GlobalUnlock((HGLOBAL) hDIB); // 释放内存
delete[] m_temp; // 恢复光标
EndWaitCursor();
}
email: [email protected]