这是我下载的一个人脸检测代码里的一个实现二值化的函数//////////////////////////////////////////////////////////////////////////
//二值化图像
//////////////////////////////////////////////////////////////////////////
bool CLikelyHood::CalBinary()
{
if(!m_bLikeliHoodReady)
return false;
int i,j;
BYTE **temp;
temp = new BYTE*[m_nHeight];
for(i=0;i <m_nHeight; i++)
{
temp[i] = new BYTE[m_nWidth];
for(j=0; j<m_nWidth; j++)
temp[i][j] = 0;
} double min = 10000000000000000.0;
int index = -1;
for(int k=5;k>=0;k--)
{
double sum = 0;
for(i=0; i<m_nHeight; i++)
for(j=0; j<m_nWidth; j++)
{
if(m_pLikeliHoodArray[i][j]>k*0.1+0.05)
m_pBinaryArray[i][j] = 1;
else
m_pBinaryArray[i][j] = 0;
sum += (m_pBinaryArray[i][j]-temp[i][j]);
}
if(sum < min)
{
min = sum;
index = 6-k;
} for(i=0; i<m_nHeight; i++)
for(j=0; j<m_nWidth; j++)
temp[i][j] = m_pBinaryArray[i][j];
} double optimalThreshold = (7-index)*0.1;
for(i=0; i<m_nHeight; i++)
for(j=0; j<m_nWidth; j++)
{
if(m_pLikeliHoodArray[i][j]>optimalThreshold)
m_pBinaryArray[i][j] = 1;
else
m_pBinaryArray[i][j] = 0;
} if(temp!=NULL)
{
for(int i=0;i<=m_nHeight-1;i++)
if(temp[i]!=NULL) delete temp[i];
delete temp;
} m_bBinaryReady = true; return true;
}
//二值化图像
//////////////////////////////////////////////////////////////////////////
bool CLikelyHood::CalBinary()
{
if(!m_bLikeliHoodReady)
return false;
int i,j;
BYTE **temp;
temp = new BYTE*[m_nHeight];
for(i=0;i <m_nHeight; i++)
{
temp[i] = new BYTE[m_nWidth];
for(j=0; j<m_nWidth; j++)
temp[i][j] = 0;
} double min = 10000000000000000.0;
int index = -1;
for(int k=5;k>=0;k--)
{
double sum = 0;
for(i=0; i<m_nHeight; i++)
for(j=0; j<m_nWidth; j++)
{
if(m_pLikeliHoodArray[i][j]>k*0.1+0.05)
m_pBinaryArray[i][j] = 1;
else
m_pBinaryArray[i][j] = 0;
sum += (m_pBinaryArray[i][j]-temp[i][j]);
}
if(sum < min)
{
min = sum;
index = 6-k;
} for(i=0; i<m_nHeight; i++)
for(j=0; j<m_nWidth; j++)
temp[i][j] = m_pBinaryArray[i][j];
} double optimalThreshold = (7-index)*0.1;
for(i=0; i<m_nHeight; i++)
for(j=0; j<m_nWidth; j++)
{
if(m_pLikeliHoodArray[i][j]>optimalThreshold)
m_pBinaryArray[i][j] = 1;
else
m_pBinaryArray[i][j] = 0;
} if(temp!=NULL)
{
for(int i=0;i<=m_nHeight-1;i++)
if(temp[i]!=NULL) delete temp[i];
delete temp;
} m_bBinaryReady = true; return true;
}
解决方案 »
- 如何在OnOpenDocument中使用CFileDialog
- WSARecv问题
- CComboBox类对象在 OnInitDialog中出错
- 超高分,要多少分给多少分,只求解决个初始化怪问题
- 如何判断socket已经关闭
- 新手再提问:未知字符"0xa1"错误是什么意思?谢谢
- 如何能实现像任务管理器中“应用程序”那样显示枚举所有用户程序!
- 菜鳥問:如何使用DateTimePicker控件??
- 谁知道为什么我的机器上不可以运行cl.exe可执行文件,但另一台可以
- 请大家发表一下有没有什么办法突破DOC/VIEW的限制。
- vc 6.0环境下 用mscomm控件已接收到串口数据,如何写进Access的表中?(最好附代码说明)
- 做3D游戏D3D与OPENGL 哪个好
for(int k=5;k>=0;k--)
{
double sum = 0;
for(i=0; i <m_nHeight; i++)
for(j=0; j <m_nWidth; j++)
{
if(m_pLikeliHoodArray[i][j]>k*0.1+0.05)
m_pBinaryArray[i][j] = 1;
else
m_pBinaryArray[i][j] = 0;
sum += (m_pBinaryArray[i][j]-temp[i][j]);
} if(sum < min)
{
min = sum;
index = 6-k;
} 具体什算法你自己仔细分析下吧