Каков наилучший способ запустить несколько потоков, которые должны зацикливаться 25 раз в секунду, не перегружая процессор - PullRequest
0 голосов
/ 19 марта 2019

Привет! Я пытаюсь захватить несколько кадров с разных 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 я не могу заставить каждую видеокассету сказать мне, готов ли новый образ, я должен продолжать исследовать его через поток и читать каждый кадр таким образом. Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...