C++에서 카메라 이미지를 가져 와서 멀티 스레딩 시도 : Mutex 버전

개요



OpenCV를 사용하여 USB 카메라에서 얻은 이미지를 출력하는 프로그램을 두 개의 스레드로 실행해 보았습니다. USB 카메라는 하나로서, 2개의 thread로 화상 취득, 2개의 thread로 화상 출력을 실시합니다. 독점 처리는 std::mutex를 사용했습니다. 결과적으로 그리기 출력의 업데이트 속도가 상당히 느렸습니다.

실행 환경



다음은 실행 환경을 보여줍니다.


소프트와 하드
버전


Visual Studio
2017

OpneCV
4.0.0


구현한 프로그램



다음에 작성한 마커 ID 취득 프로그램을 나타냅니다. 카메라는 USB 카메라를 사용했습니다.

multi_thread_with_mutex.cpp
#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"
#include<thread>
#include<time.h>
#include<mutex>

cv::VideoCapture cap(1);
cv::Mat frame;
std::mutex mtx;


void GetFrameFromCameraFunction() {

    while (true) {
        std::lock_guard<std::mutex> lock(mtx);
        printf("\nRead Thread\n");
        cap.read(frame);
    }
}

int ShowFrameFromCameraFunction() {

    while (true) {
        std::lock_guard<std::mutex> lock(mtx);
        printf("\nShow Thread\n");
        cv::imshow("WIndow1", frame);
        const int key = cv::waitKey(1);
        if (key == 27) {

            printf("\n Close Window !!\n");
            return 1;
        }
        else if (key == 's') {

            cv::imwrite("th2.png", frame);

        }
    }   
}


int main(int argh, char* argv[])
{

    std::thread GetFrameThread(GetFrameFromCameraFunction);
    std::thread ShowFrameThread(ShowFrameFromCameraFunction);

    ShowFrameThread.join();
    GetFrameThread.join();


    cv::destroyAllWindows();
    return 0;

}

구현 프로그램 실행



위의 프로그램을 실행한 경우의 결과를 나타냅니다.
  • 전체 이미지

  • 그리기 업데이트 속도가 상당히 느린 것 같습니다. 다음은 세마포어와 같은 배타 제어에 의해 프로그램을 구현하고 싶습니다.

    요약



    하나의 USB 카메라에서 단순히 이미지를 두 개의 스레드로 나누는 경우에 std::mutex를 사용한 경우에는 드로잉 업데이트 속도가 상당히 느린 것으로 나타났습니다. 또, 잘못하고 있는 곳이나, 추가하는 편이 좋다, 이런 쓰는 쪽이 좋다! 라는 부분이 있으면 가르쳐 주시면 매우 기쁩니다.

    좋은 웹페이지 즐겨찾기