Привет! Я пытаюсь захватить несколько кадров с разных IP-камер через openCV. У меня есть 12-ядерный процессор i7, и в настоящее время я могу транслировать 4 IP-камеры HD и отображать каждую камеру в окне наложения матрицы 2 x 2, но моя проблема - потоковая передача эти 4 камеры используют 20% моего процессора, если я не использую режим сна в каждом потоке, который затем замедляет отображение оттуда истинной частоты кадров. Я использую таймеры для запуска каждого потока, который вызывает opencv для чтения каждого кадра, изменяет размер изображения до размера каждого матричного кадра и передает каждый буфер Mat в оверлей Directx 11. Если я установлю камеры для потоковой передачи со скоростью 25 кадров в секунду, мои таймеры для запуска каждого события потока будут установлены на 40 миллисекунд, что составляет 25 событий каждую секунду, но это приводит к потере моего ЦП, вот часть кода, который я использую для своих потоков
void mCam1(void * p)
{
COpenCVROIDlg* pThis = (COpenCVROIDlg*)p;
v_Mat[pThis->m_MatrixView].copyTo(v_MatPre[pThis->m_MatrixView]);
cv::Point pt;
cv::Mat m_img, imgResized, m_matrix;
if (!pThis->camera0.isOpened()) {
// Send not connected to list control
}else{
pThis->camera0.read(m_img);
if (m_img.empty()) {
//send no signal to list control
}
else {
cv::resize(m_img, imgResized, cv::Size(v_Cams[pThis->m_MatrixView][0].mPT.rc.right, v_Cams[pThis->m_MatrixView][0].mPT.rc.bottom), 0, 0, INTER_LINEAR_EXACT);
Rect roi(v_Cams[pThis->m_MatrixView][0].mPT.pt.x, v_Cams[pThis->m_MatrixView][0].mPT.pt.y, imgResized.cols, imgResized.rows);
v_Mat[pThis->m_MatrixView].copyTo(m_matrix);
imgResized.copyTo(m_matrix(roi));
m_matrix.copyTo(v_Mat[pThis->m_MatrixView]);
cv::waitKey(1);
}
}
cv::waitKey(84);// 12 frames per second
}
void CreateThreads(){
m_hEventStream0 = CreateEvent(NULL, FALSE, FALSE, 0);`
ghOnvifThread[2] = CreateThread(
NULL, // default security
0, // default stack size
(LPTHREAD_START_ROUTINE)ThreadCamera1, // name of the thread function
LPVOID(this), // no thread parameters
THREAD_TERMINATE | THREAD_SET_CONTEXT, // default startup flags
&dwThreadID[2]);
SetTimer(TM_CAMERA0, 10, NULL);
}
static LPTHREAD_START_ROUTINE ThreadCamera1(LPVOID _pParam)
{
COpenCVROIDlg* pThis = (COpenCVROIDlg*)_pParam;
HANDLE hEvent;
hEvent = m_hEventStream0;
DWORD dwEventObject;
__try
{
while (dwThreadID[2])
{
dwEventObject = WaitForSingleObject(hEvent, INFINITE);
if (dwEventObject == (WAIT_OBJECT_0))
{
mCam1(pThis);
}
}
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
// ExitThread(0x2222E000);
return 0;
}
ExitThread(0x22220000);
return 0;
}
Может ли кто-нибудь показать мне пример или указать, как я могу запустить несколько потоков без чрезмерной загрузки ЦП. Кажется, с opencv я не могу заставить каждую видеокассету сказать мне, готов ли новый образ, я должен продолжать исследовать его через поток и читать каждый кадр таким образом.
Спасибо