gpt4 book ai didi

c++ - 使用 OpenCv 和多线程从 IP 摄像机获取实时视频

转载 作者:太空宇宙 更新时间:2023-11-04 14:32:09 27 4
gpt4 key购买 nike

感谢您花时间阅读我的帖子。我有一个应用程序,它接受 IP 摄像机的用户名、密码和 IP 地址并显示视频源(这是通过使用计时器完成的),我还有一个名为“Capture”的按钮,单击它会将图像保存到我的磁盘。我也同时对两个 IP 摄像机进行了相同的尝试,但是当添加另一个摄像机时,第一个摄像机的流速度变慢。所以我的问题是“他们是否可以通过在我的应用程序中使用线程来解决这个减速问题”。我是 MFC、C++ 和 OpenCV 的新手。我正在使用 OpenCV 显示来自网络摄像头的视频源。请专家帮助我找到正确的解决方案。这是我为获取视频源而实现的代码。

void CStaticEx::OnPaint()
{
CPaintDC dc(this); // device context for painting

CRect rect;
GetClientRect(&rect);

m_pFrameImg = cvQueryFrame(m_pCamera);
//If camera is disconnected, control goes
//in if condition and displays message in
//picture control
if(m_pFrameImg == NULL){
KillTimer( ONE);
CString sCamName;
sCamName.Format(_T(CAM_ID_TXT),m_IpAddr);
CString sDviceLost = _T(CONNECTION_LOST_TXT);
sCamName.Append(sDviceLost);
dc.SetBkMode(OPAQUE);
dc.SetBkColor(BACKBRND_COLOR_TXTOUT);
dc.SetTextColor(ERR_TXT_COLOR);// BGR(0xbbggrr);
dc.TextOut(ERR_TXT_XAXIS,ERR_TXT_YAXIS,sCamName,sCamName.GetLength());
return;//check after removinf return;
}
BITMAPINFO bitmapInfo;
bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bitmapInfo.bmiHeader.biPlanes = ONE;
bitmapInfo.bmiHeader.biCompression = BI_RGB;
bitmapInfo.bmiHeader.biXPelsPerMeter = PELSPERMETER;
bitmapInfo.bmiHeader.biYPelsPerMeter = PELSPERMETER;
bitmapInfo.bmiHeader.biClrUsed = ZERO;
bitmapInfo.bmiHeader.biClrImportant = ZERO;
bitmapInfo.bmiHeader.biSizeImage = ZERO;
bitmapInfo.bmiHeader.biWidth = m_pFrameImg->width;
bitmapInfo.bmiHeader.biHeight = -m_pFrameImg->height;
IplImage* tempImage;

if(m_pFrameImg->nChannels == THREE) //Number of color channels (1,2,3,4)
{
tempImage = (IplImage*)cvClone(m_pFrameImg);
bitmapInfo.bmiHeader.biBitCount=tempImage->depth * tempImage->nChannels;
}
else if(m_pFrameImg->nChannels == ONE) //Number of color channels (1,2,3,4)
{
tempImage = cvCreateImage(cvGetSize(m_pFrameImg), IPL_DEPTH_8U, THREE);
cvCvtColor(m_pFrameImg, tempImage, CV_GRAY2BGR);
bitmapInfo.bmiHeader.biBitCount=tempImage->depth * tempImage->nChannels;
}
dc.SetStretchBltMode(COLORONCOLOR);
::StretchDIBits(dc.GetSafeHdc(), rect.left, rect.top, rect.right, rect.bottom,
ZERO, ZERO, tempImage->width, tempImage->height, tempImage->imageData, &bitmapInfo,
DIB_RGB_COLORS, SRCCOPY);
cvReleaseImage(&tempImage);
//String for giving Camera name
CString sCamName;
sCamName.Format(_T("Video Stream IP Cam-%s"), m_IpAddr);
dc.SetBkMode(OPAQUE);
dc.SetBkColor(MSG_BGCOLOR);
dc.SetTextColor(WHITE);// BGR(0xbbggrr);
dc.TextOut(MSG_TXT_XAXIS, MSG_TXT_YAXIS, sCamName, sCamName.GetLength());
ReleaseDC(&dc);
SetTimer( ONE,30, NULL);

}
void CStaticEx::OnTimer(UINT_PTR nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(nIDEvent = ONE){

Invalidate();
}

CStatic::OnTimer(nIDEvent);
}

提前致谢。祝你有美好的一天。

最佳答案

请引用以下内容以从实时相机捕获帧。<强> http://www.codeproject.com/Questions/442770/Connect-to-IP-Camera-in-Cplusplus

关于c++ - 使用 OpenCv 和多线程从 IP 摄像机获取实时视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20654735/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com