반응형

pthread와 mutex를 OpenCV와 같이 사용하는 예제입니다.



main함수에서 웹캠을 열어주고 UpdateFrame 스레드를 생성하고  UpdateFrame 스레드 에서는 웹캠으로 부터 영상을 넘겨주길 기다렸다가 그레이 영상으로 변환 후 화면에 출력합니다. 이때 뮤택스를 사용하여 공유자원인 frame으로의 접근 문제를 해결합니다.  ESC키를 입력하게 되면 스레드를 강제 종료시키고 프로그램을 종료합니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <pthread.h>
 
using namespace cv;
using namespace std;
 
VideoCapture vcap;
Mat frame;
 
pthread_mutex_t frameLocker;
pthread_t UpdThread;    
 
 
void *UpdateFrame(void *arg)
{
    for(;;)
    {
        Mat tempFrame;
        vcap >> tempFrame;
 
        pthread_mutex_lock(&frameLocker);
        frame = tempFrame;
        pthread_mutex_unlock(&frameLocker);
    }
 
    pthread_exit( (void *)0 );
}
 
 
int main(intchar**
    vcap.open(0);
 
    pthread_mutex_init(&frameLocker,NULL);  
    pthread_create(&UpdThread, NULL, UpdateFrame, NULL);
 
 
    for(;;)
    {
        Mat currentFrame, grayImage;
 
        pthread_mutex_lock(&frameLocker);
        currentFrame = frame;
        pthread_mutex_unlock(&frameLocker);
 
    
        if(currentFrame.empty())
            continue;
 
 
        cvtColor( currentFrame,  grayImage, COLOR_BGR2GRAY);
        imshow("Input Image", currentFrame);
        imshow("Gray Image", grayImage);
 
 
        //ESC키를 누르면 쓰레드를 강제 종료후.. 프로그램 종료한다. 
        if (waitKey(20== 27 ) 
        {
 
            int ret = pthread_cancel( UpdThread );
            int status;
 
            if (ret == 0 )
            {
                //자동 종료    
                ret = pthread_join( UpdThread, (void **)&status );
                if ( ret == 0 )
                    //강제 종료시키면 status로 -1이 리턴된다. 
                    cout << "스레드 종료 성공" << status << endl;
                else
                    cout << "스레드 종료 에러" << ret << endl;
 
                break;
            }
        }
                
    }
 
    return 0;
}
 
cs


컴파일을 한 후, 실행시켜 봅니다.

1
2
webnautes@webnautes-notebook ~ $ g++ opencv_with_pthread.cpp -o test `pkg-config --cflags --libs opencv` -lpthread 
webnautes@webnautes-notebook ~ $ ./test 
cs


실행 결과입니다. 


참고

http://www.joinc.co.kr/w/Site/Thread/Beginning/Example_pthread

http://stackoverflow.com/questions/27333498/opencv-with-pthreads-and-mutexes


반응형

포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

유튜브 구독하기


제가 쓴 책도 한번 검토해보세요.

  1. 질문있습니다. 2017.05.12 16:04

    카메라 한개 더 추가 할 떄 VideoCapture cap2 등 과 같은 카메라 입출력 코드 말고 thread 소스 pthread_mutex_lock(&frameLocker); pthread_mutex_unlock(&frameLocker);등 과 같이 추가 할 게 있나요 ..??

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2017.05.12 21:25 신고

      뮤텍스나 쓰레드 관련 변수, 함수가 하나씩 더있어야 합니다

+ Recent posts