首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

基于sobel的视频图像边缘检测 高手啊 报错说内存引用不能为write 请大家耐心看完O(∩_∩)O哈哈

2012-08-10 
基于sobel的视频图像边缘检测求救高手啊 报错说内存引用不能为write请大家耐心看完O(∩_∩)O哈哈~在图像采集

基于sobel的视频图像边缘检测 求救高手啊 报错说内存引用不能为write 请大家耐心看完O(∩_∩)O哈哈~
在图像采集卡得开发包得VC工程里添加sobel算子 实现边缘检测 
这是sobel算子
/*************************************************************************
 * 函数名称:
 * SobelDIB()
 * 参数:
 * LPSTR lpDIBBits - 指向源DIB图像指针
 * LONG lWidth - 源图像宽度(象素数,必须是4的倍数)
 * LONG lHeight - 源图像高度(象素数)
 * 返回值:
 * BOOL - 边缘检测成功返回TRUE,否则返回FALSE。
 * 说明:
 * 该函数用Sobel边缘检测算子对图像进行边缘检测运算。
 * 要求目标图像为灰度图像。
 ************************************************************************/
BOOL SobelDIB(LPSTR lpDIBBits, LONG m_width, LONG m_height)/////////pDC->m_hDC,0,0,m_width,m_height,0,0,m_width,m_height,m_lpbuff,m_pBmpInfo,DIB_RGB_COLORS, SRCCOPY
{
LPSTRlpDst1;// 指向缓存图像的指针 /////////lpDIBBits
LPSTRlpDst2;
LPSTRlpNewDIBBits1;// 指向缓存DIB图像的指针
HLOCALhNewDIBBits1;
LPSTRlpNewDIBBits2;
HLOCALhNewDIBBits2;

long i,j;// 循环变量
intiTempH;// 模板高度
intiTempW;// 模板宽度
FLOATfTempC;// 模板系数
intiTempMX;// 模板中心元素X坐标
intiTempMY;// 模板中心元素Y坐标
FLOAT aTemplate[9];// 模板数组

// 暂时分配内存,以保存新图像
hNewDIBBits1 = LocalAlloc(LHND, m_width * m_height);
if (hNewDIBBits1 == NULL)
{
return FALSE;
}

lpNewDIBBits1 = (char * )LocalLock(hNewDIBBits1);

// 暂时分配内存,以保存新图像
hNewDIBBits2 = LocalAlloc(LHND, m_width * m_height);
if (hNewDIBBits2 == NULL)
{
return FALSE;
}

lpNewDIBBits2 = (char * )LocalLock(hNewDIBBits2);

// 拷贝源图像到缓存图像中
lpDst1 = (char *)lpNewDIBBits1;
memcpy(lpNewDIBBits1, lpDIBBits, m_width * m_height);
lpDst2 = (char *)lpNewDIBBits2;
memcpy(lpNewDIBBits2,lpDIBBits, m_width * m_height);

// 设置Sobel模板参数
iTempW = 3;
iTempH = 3;
fTempC = 1.0;
iTempMX = 1;
iTempMY = 1;
aTemplate[0] = -1.0;
aTemplate[1] = -2.0;
aTemplate[2] = -1.0;
aTemplate[3] = 0.0;
aTemplate[4] = 0.0;
aTemplate[5] = 0.0;
aTemplate[6] = 1.0;
aTemplate[7] = 2.0;
aTemplate[8] = 1.0;

if (!Template(lpNewDIBBits1, m_width, m_height, 
iTempH, iTempW, iTempMX, iTempMY, aTemplate, fTempC))
{
return FALSE;
}

// 设置Sobel模板参数
aTemplate[0] = -1.0;
aTemplate[1] = 0.0;
aTemplate[2] = 1.0;
aTemplate[3] = -2.0;
aTemplate[4] = 0.0;
aTemplate[5] = 2.0;
aTemplate[6] = -1.0;
aTemplate[7] = 0.0;
aTemplate[8] = 1.0;

if (!Template(lpNewDIBBits2, m_width, m_height, 
iTempH, iTempW, iTempMX, iTempMY, aTemplate, fTempC))
{
return FALSE;
}

//求两幅缓存图像的最大值
for(j = 0; j <m_height; j++)
{
for(i = 0;i <m_width-1; i++)
{
// 指向缓存图像1倒数第j行,第i个象素的指针
lpDst1 = (char *)lpNewDIBBits1 + m_width * j + i;
// 指向缓存图像2倒数第j行,第i个象素的指针
lpDst2 = (char *)lpNewDIBBits2 + m_width * j + i;

if(*lpDst2 > *lpDst1)
{
*lpDst1 = *lpDst2;
}
}
}

// 复制经过模板运算后的图像到源图像
memcpy(lpDIBBits, lpNewDIBBits1, m_width * m_height);

LocalUnlock(hNewDIBBits1);
LocalFree(hNewDIBBits1);
LocalUnlock(hNewDIBBits2);
LocalFree(hNewDIBBits2);

return TRUE;


}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL Template(LPSTR lpDIBBits, LONG lWidth, LONG lHeight, 
int iTempH, int iTempW, int iTempMX, int iTempMY,
FLOAT * fpArray, FLOAT fCoef)
{
LPSTRlpNewDIBBits;// 指向复制图像的指针
HLOCALhNewDIBBits;
unsigned char*lpSrc;// 指向源图像的指针
unsigned char*lpDst;// 指向要复制区域的指针
LONGi,j,k,l;// 循环变量
FLOATfResult;// 计算结果



LONG lLineBytes;// 图像每行的字节数
lLineBytes = sizeof(lWidth * 8);////////////WIDTHBYTES///////////////////////////////////////////////////////////////////////////////////

// 暂时分配内存,以保存新图像
hNewDIBBits = LocalAlloc(LHND, lLineBytes * lHeight);
if (hNewDIBBits == NULL)
{
return FALSE;
}

lpNewDIBBits = (char * )LocalLock(hNewDIBBits);

// 初始化图像为原始图像
memcpy(lpNewDIBBits, lpDIBBits, lLineBytes * lHeight);

for(i = iTempMY; i < lHeight - iTempH + iTempMY + 1; i++)// 行(除去边缘几行)
{
for(j = iTempMX; j < lWidth - iTempW + iTempMX + 1; j++)// 列(除去边缘几列)
{
// 指向新DIB第i行,第j个象素的指针
lpDst = (unsigned char*)lpNewDIBBits + lLineBytes * (lHeight - 1 - i) + j;

fResult = 0;

for (k = 0; k < iTempH; k++)
{
for (l = 0; l < iTempW; l++)
{
// 指向DIB第i - iTempMY + k行,第j - iTempMX + l个象素的指针
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 
- i + iTempMY - k) + j - iTempMX + l;

// 保存象素值
fResult += (* lpSrc) * fpArray[k * iTempW + l];
}
}

fResult *= fCoef;// 乘上系数
fResult = (FLOAT ) fabs(fResult);// 取绝对值
if(fResult > 255)
{
* lpDst = 255;
}
else
{
* lpDst = (unsigned char) (fResult + 0.5);
}
}
}

// 复制变换后的图像
memcpy(lpDIBBits, lpNewDIBBits, lLineBytes * lHeight);

LocalUnlock(hNewDIBBits);
LocalFree(hNewDIBBits);

return TRUE;
}
///////////////////////////////////////////////////////////////////////
void WINAPI streamcallback(LPBYTE lpBuf,long len,PVOID m_pContext)////////////LPBYTE lpBuf指向图像数据地址
{
CVCdemoDlg *pDlg=(CVCdemoDlg*)m_pContext;
memcpy(pDlg->m_lpbuff,lpBuf,len);
////////////////////////////////////////////////////////
memcpy(lpDIBBits,pDlg->m_lpbuff,len);
SobelDIB((char*)lpDIBBits,pDlg->m_width ,pDlg->m_height ); ///////////////////我想在这调用sobel



////////////////////////////////////////////////////////////
pDlg->showpic();
if(pDlg->m_bcode) MV_AVIWrite(pDlg->m_handle,lpBuf);

if(m_dwEnd-m_dwStart>1000)
{
fps = 1000.0 * m_dwCount / (m_dwEnd-m_dwStart);
m_dwCount=0;
m_dwEnd=m_dwStart=::GetTickCount();
}
else
{
m_dwEnd=::GetTickCount();
m_dwCount++;
}
}

[解决办法]
我也遇到类似的问题了!!
[解决办法]
lLineBytes = sizeof(lWidth * 8);
这是什么?!

热点排行