视频图像的监控系统,从摄像头采集图像进行显示和处理,采用线程显示图像,由于在采集卡SDK中使用的是在编辑框中显示图像,因此编程初期直接选择了在编辑框中显示图像,但是现在是显示不了图像,紧急求教!
“显示”按钮的代码:
void CCGViewSystemDlg::OnStartCap()
{
m_hSnapThread = (HANDLE)_beginthreadex(NULL,
NULL,
(PTHREAD_START)SnapThreadCallback,
this,
CREATE_SUSPENDED,
&m_dwThreadID); //启动线程
if (m_hSnapThread != NULL)
{
IfStarCap = TRUE; //标识开始采集
ResumeThread(m_hSnapThread);
}
}
对应的线程代码:
DWORD CCGViewSystemDlg::SnapThreadCallback(LPVOID lpThreadParameter)
{
CGSTATUS status = CG_OK; //采集卡状态
BOOL bComplete = FALSE; //标识是否完成
int nStatus = 0, nNumber = 0; //采集状态相关参数
CCGViewSystemDlg *pFrame = NULL; pFrame = (CCGViewSystemDlg *)lpThreadParameter;
ASSERT(pFrame); status = CGStartSnap(pFrame->m_hcg, 0, TRUE, 2); //采集卡的类库函数,开始采集两帧
CG_VERIFY(status); //采集卡状态检测函数
if (CG_SUCCESS(status))
{
while(pFrame->IfStarCap)
{
CGGetSnappingNumber(pFrame->m_hcg, &nStatus); //这一段为采集卡采集操作,SDK中直
if (pFrame->m_ScanMode == FRAME){ //接拷的,应该没有问题
if ((nStatus == 2) && (! bComplete) )
{
nNumber = 0;
bComplete = TRUE;
}
if ((nStatus == 0) && bComplete)
{
nNumber = 1;
bComplete = FALSE;
}
}
else{
if ((nStatus == 1) && (! bComplete))
{
nNumber = 0;
bComplete = TRUE;
}
if ((nStatus == 0) && bComplete)
{
nNumber = 1;
bComplete = FALSE;
}
} if (nNumber >= 0) //当采集到图像帧执行显示函数ShowSnap
{
pFrame->ShowSnap(nNumber);
nNumber = -1;
}
Sleep(1);
}
}
CGStopSnap(pFrame->m_hcg);
return 1;
}
调用的ShowSnap(int nNumber)函数:
BOOL CCGViewSystemDlg::ShowSnap(int nNumber)
{
CGSTATUS status = CG_OK;
CDC *pDC = NULL;
BYTE *pLinearAddr = NULL;
DWORD dwImageSize = 0;
HANDLE handle = NULL;
pDC = GetDlgItem(IDC_VIDEOWIN)->GetDC(); //取得编辑框IDC_VIDEOWIN的DC
ASSERT(pDC);
dwImageSize = 400 * 300 * 3; status = CGStaticMemLock(dwImageSize * nNumber, dwImageSize, &handle, (PVOID *)&pLinearAddr);
//锁定静态内存,就是这个时候内存里的数据是采集来的图像数据了
if (CG_SUCCESS(status))
{
CGDataTransform(m_pImageBuffer,
pLinearAddr,
400,
300,
24,
TRUE
); //转换原始图像数据为24位位图
CGStaticMemUnlock(handle); //解锁静态内存
}
StretchDIBits(pDC->GetSafeHdc(), //这个是我在网上找的,把数据拷贝到矩形中
0,
0,
400,
300,
0,
0,
400,
300,
m_pImageBuffer,
m_pBmpInfo,
DIB_RGB_COLORS,
SRCCOPY
);
return 1;
}
图像显示方面只写了这些代码,其他的只有一个参数的初始化等。我是模仿采集卡SDK写的,但是SDK例程比较复杂,所以没有很深入的学习,我想问的是,要怎样才能在编辑框中显示图像呢?是不是还要在其他代码上进行刷新或者重画的操作?上面的代码编译都通过的,就是不显示图像,运行时也没有任何错误。各位高手们,帮帮忙吧,我都焦头烂额了!!第一次发帖,好像也没有积分,所以,可能不能给多的分数了,麻烦了
“显示”按钮的代码:
void CCGViewSystemDlg::OnStartCap()
{
m_hSnapThread = (HANDLE)_beginthreadex(NULL,
NULL,
(PTHREAD_START)SnapThreadCallback,
this,
CREATE_SUSPENDED,
&m_dwThreadID); //启动线程
if (m_hSnapThread != NULL)
{
IfStarCap = TRUE; //标识开始采集
ResumeThread(m_hSnapThread);
}
}
对应的线程代码:
DWORD CCGViewSystemDlg::SnapThreadCallback(LPVOID lpThreadParameter)
{
CGSTATUS status = CG_OK; //采集卡状态
BOOL bComplete = FALSE; //标识是否完成
int nStatus = 0, nNumber = 0; //采集状态相关参数
CCGViewSystemDlg *pFrame = NULL; pFrame = (CCGViewSystemDlg *)lpThreadParameter;
ASSERT(pFrame); status = CGStartSnap(pFrame->m_hcg, 0, TRUE, 2); //采集卡的类库函数,开始采集两帧
CG_VERIFY(status); //采集卡状态检测函数
if (CG_SUCCESS(status))
{
while(pFrame->IfStarCap)
{
CGGetSnappingNumber(pFrame->m_hcg, &nStatus); //这一段为采集卡采集操作,SDK中直
if (pFrame->m_ScanMode == FRAME){ //接拷的,应该没有问题
if ((nStatus == 2) && (! bComplete) )
{
nNumber = 0;
bComplete = TRUE;
}
if ((nStatus == 0) && bComplete)
{
nNumber = 1;
bComplete = FALSE;
}
}
else{
if ((nStatus == 1) && (! bComplete))
{
nNumber = 0;
bComplete = TRUE;
}
if ((nStatus == 0) && bComplete)
{
nNumber = 1;
bComplete = FALSE;
}
} if (nNumber >= 0) //当采集到图像帧执行显示函数ShowSnap
{
pFrame->ShowSnap(nNumber);
nNumber = -1;
}
Sleep(1);
}
}
CGStopSnap(pFrame->m_hcg);
return 1;
}
调用的ShowSnap(int nNumber)函数:
BOOL CCGViewSystemDlg::ShowSnap(int nNumber)
{
CGSTATUS status = CG_OK;
CDC *pDC = NULL;
BYTE *pLinearAddr = NULL;
DWORD dwImageSize = 0;
HANDLE handle = NULL;
pDC = GetDlgItem(IDC_VIDEOWIN)->GetDC(); //取得编辑框IDC_VIDEOWIN的DC
ASSERT(pDC);
dwImageSize = 400 * 300 * 3; status = CGStaticMemLock(dwImageSize * nNumber, dwImageSize, &handle, (PVOID *)&pLinearAddr);
//锁定静态内存,就是这个时候内存里的数据是采集来的图像数据了
if (CG_SUCCESS(status))
{
CGDataTransform(m_pImageBuffer,
pLinearAddr,
400,
300,
24,
TRUE
); //转换原始图像数据为24位位图
CGStaticMemUnlock(handle); //解锁静态内存
}
StretchDIBits(pDC->GetSafeHdc(), //这个是我在网上找的,把数据拷贝到矩形中
0,
0,
400,
300,
0,
0,
400,
300,
m_pImageBuffer,
m_pBmpInfo,
DIB_RGB_COLORS,
SRCCOPY
);
return 1;
}
图像显示方面只写了这些代码,其他的只有一个参数的初始化等。我是模仿采集卡SDK写的,但是SDK例程比较复杂,所以没有很深入的学习,我想问的是,要怎样才能在编辑框中显示图像呢?是不是还要在其他代码上进行刷新或者重画的操作?上面的代码编译都通过的,就是不显示图像,运行时也没有任何错误。各位高手们,帮帮忙吧,我都焦头烂额了!!第一次发帖,好像也没有积分,所以,可能不能给多的分数了,麻烦了
解决方案 »
- .img文件怎么处理?
- 求助,怎样显示一张图片的中间区域
- 现有可执行程序A,无源码,现做一个程序B,在A最小化时捕获其消息,我现在用WH_CBT Hook可以捕获最小,最大化消息,但我怎么区分是发生了
- 单击Button1按钮,出现对话框“终止”“忽略”“取消”对话框。用Alt+4在Variables中看到hwnd=0x00000000,怎么改?
- 老问题:VC多文档中如何去掉标题栏中自动产生的数字???
- (大侠们帮帮看看)同时连接两个数据源为什么运行的时候会出错?(回答后马上给分)
- 技术问题,不可不看啊!
- 关于Winsock的几个一直很困惑的问题
- 急急!!多文档新建时如何指定模版中的一个?在线等,解决就给分
- C++开发服务器的内存使用问题
- unresolved external symbol 不知道是缺少什么类库
- 学习MFC遇到的问题呀!菜鸟提问!
谢谢啦!我之前也想到会不会是接口的问题,但是一直没有找到。我会再好好看下SDK