У меня есть многопоточная программа, которая использует opencv для чтения и обработки изображений с USB-камеры. У меня есть один поток, который читает только кадры с камеры, а другой обрабатывает эти изображения. Я запускаю эту программу на одноплатном компьютере JetsonNano, если это актуально.
Она работала, как и ожидалось, пока я не проверил утечки памяти с помощью Valgrind. Под Valgrind мой объект VideoCapture не может открыть камеру. Я хотел бы знать, почему это происходит в Valgrind, а не при нормальной работе программы.
В целях тестирования я удалил весь код, связанный с обработкой изображений. Соответствующий код, который остается, был прикреплен ниже.
определение захвата:
cv::VideoCapture cap;
инициализация захвата:
CameraController::CameraController : cap(0){}
функция чтения кадра:
void CameraController::startReadingFromCamera() {
while (readingFromCamera) { //boolean member variable
mutex.lock();
std::cout << cap.isOpened() << std::endl;
//this prints 0 under Valgrind, 1 when run without Valgrind
//currentFrame is a member variable.
//This is how the processing thread will access the newest frame
cap.read(currentFrame);
mutex.unlock();
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
}
инициализация потока:
CameraController cameraController;
thread videoThread(&CameraController::startReadingFromCamera, &cameraController);
Я могу включить вывод Valgrind, если это необходимо, но я довольно новичок в Valgrind. Я не уверен, какие части журналов будут полезны при анализе этой проблемы.