在图像采集卡得开发包得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
{
LPSTR lpDst1; // 指向缓存图像的指针              /////////lpDIBBits
LPSTR lpDst2;
LPSTR lpNewDIBBits1; // 指向缓存DIB图像的指针
HLOCAL hNewDIBBits1;
LPSTR lpNewDIBBits2;
HLOCAL hNewDIBBits2;

long i,j; // 循环变量
int iTempH; // 模板高度
int iTempW; // 模板宽度
FLOAT fTempC; // 模板系数
int iTempMX; // 模板中心元素X坐标
int iTempMY; // 模板中心元素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)
{
LPSTR lpNewDIBBits; // 指向复制图像的指针
HLOCAL hNewDIBBits;
unsigned char* lpSrc; // 指向源图像的指针
unsigned char* lpDst; // 指向要复制区域的指针
LONG i,j,k,l; // 循环变量
FLOAT fResult; // 计算结果

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++;
}
}