Как избавиться от ошибки плохого аргумента OpenCv - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть три периодические задачи в реальном времени, которые выполняются одновременно, каждая на другом процессоре (ядре) для захвата видео с использованием OpenCV.

Для синхронизации между тремя задачами я использовал массив cv::Mat и каждый раз менял индекс, чтобы избежать гонки данных.Благодаря ответам на мой предыдущий пост о синхронизации чтения / записи в буфере, я смог придумать такое решение:

cv::Mat frame[3];
int frame_index_write = 0;
int frame_index_read = 1;
int frame_index_read_ = 2;

int SwapIndex(int *fi){
return *fi = (*fi + 1) % 3;
}

Теперь первая задача захватывает захват и сохраняет его вбуфер и передает сигнал другим задачам, чтобы они могли получить захваченные кадры:

 while (1)
{
    capture.grab();
    capture.retrieve(frame[frame_index_write], CHANNEL);
    SwapIndex(&frame_index_write);
    pthread_cond_broadcast(&synch_condition); /* After capturing the frame
                                                signal the displaying tasks*/
   }

Вторая задача получает захваченный кадр и отображает его:

 while (1)
{
    pthread_cond_wait(&synch_condition, &frame_rw); /*wait for the capturing
                                                      func to send a signal*/
    if (frame[frame_index_read].data)
    {
        cv::imshow(CAPTURED_IMAGE_WINDOW_NAME, frame[frame_index_read]);
        SwapIndex(&frame_index_read);
        cv::waitKey(1);
    }
    else{
        std::cout << "Frame reading error" << std::endl;
    }
    }

Третья задачаполучает захваченный кадр и применяет процесс обнаружения края перед его отображением:

while (1)
{
    pthread_cond_wait(&synch_condition, &frame_rw); /*wait for the capturing
                                                      func to send a signal*/
    if (frame[frame_index_read_].data)
    {
        cv::cvtColor(frame[frame_index_read_], gray_capture, cv::COLOR_BGR2GRAY);
        cv::blur(gray_capture, detected_edges, cv::Size(3, 3));
        cv::Canny(detected_edges, detected_edges, 0, 100, 3);
        cv::imshow(EDGE_IMAGE_WINDOW_NAME, detected_edges);
        SwapIndex(&frame_index_read_);
        cv::waitKey(1);
    }
    else{
        std::cout << "Frame reading error" << std::endl;
    }
    }

Кажется, мой код работает отлично, и результаты также были ожидаемыми, но когда я остановил выполнение на терминале, я получил следующий выводуказывает на ошибку:

VIDIOC_DQBUF: неверный аргумент

ошибка OpenCV: неверный аргумент (неизвестный тип массива) в cvarrToMat, файл /build/opencv-L2vuMj/opencv-3.2.0+dfsg / modules / core / src / matrix.cpp, строка 943 завершается, после вызова экземпляра 'cv :: Exception' what (): /build/opencv-L2vuMj/opencv-3.2.0+dfsg/modules/core / src / matrix.cpp: 943: ошибка: (-5) Неизвестный тип массива в функции cvarrToMat

Есть ли способ обработки такого рода ошибки?

Завершенокод размещен на Github

Любая помощь будет очень признательна по этой теме.

...