実現したいこと
Thread
を用いたOpenCVでの画像表示
発生している問題・エラーメッセージ
ShowManyImages()
はスレッド化していないimg0
,img1
,img2
を入力としたら,問題なく動作しました.
そこで各img
をスレッド化しようということで,以下のように関数化したのですが,ShowManyImages()の引数に各multi_imread
を入力したところ以下のようにエラーが出てき,うまくスレッド化して表示させることができませんでした.
恐らく,スレッドとして立てた際に返り値img
にならないことに起因していると思うのですが,どのように直せばいいかわからなかったのでここに質問するに至りました.
sh
1multi_client.cpp:180:44: error: use of deleted function ‘std::thread::thread(std::thread&)’ 2 ShowManyImages("IMAGE",3,th_0,th_1,th_2); 3 ^ 4In file included from multi_client.cpp:8:0: 5/usr/include/c++/7/thread:109:5: note: declared here 6 thread(thread&) = delete; 7 ^~~~~~ 8multi_client.cpp:180:44: error: use of deleted function ‘std::thread::thread(std::thread&)’ 9 ShowManyImages("IMAGE",3,th_0,th_1,th_2); 10 ^ 11In file included from multi_client.cpp:8:0: 12/usr/include/c++/7/thread:109:5: note: declared here 13 thread(thread&) = delete; 14 ^~~~~~ 15multi_client.cpp:180:44: error: use of deleted function ‘std::thread::thread(std::thread&)’ 16 ShowManyImages("IMAGE",3,th_0,th_1,th_2); 17 ^ 18In file included from multi_client.cpp:8:0: 19/usr/include/c++/7/thread:109:5: note: declared here 20 thread(thread&) = delete; 21 ^~~~~~ 22<ビルトイン>: recipe for target 'multi_client.o' failed 23make: *** [multi_client.o] Error 1 24
該当のソースコード
cpp
1# include <opencv2/core/core.hpp> 2# include <opencv2/opencv.hpp> 3# include <opencv2/highgui/highgui.hpp> 4# include <iostream> 5# include <stdio.h> 6# include <stdarg.h> 7# include <zmq.hpp> 8# include <thread> 9# include <mutex> 10# include <vector> 11 12std::mutex mtx; 13using namespace cv; 14using namespace std; 15 16Mat multi_imread0() 17{ 18 mtx.lock(); 19 Mat img0; 20 img0 = imread("images.jpeg"); 21 resize(img0,img0,cv::Size(),500.0/img0.cols, 500.0/img0.rows); 22 if(img0.empty()) perror; 23 else return img0; 24 mtx.unlock(); 25} 26 27Mat multi_imread1() 28{ 29 mtx.lock(); 30 Mat img1; 31 img1 = imread("images1.jpeg"); 32 resize(img1,img1,cv::Size(),500.0/img1.cols, 500.0/img1.rows); 33 if(img1.empty()) perror; 34 else return img1; 35 mtx.unlock(); 36 37} 38 39 40Mat multi_imread2() 41{ 42 mtx.lock(); 43 Mat img2; 44 img2 = imread("image2.jpg"); 45 resize(img2,img2,cv::Size(),500.0/img2.cols, 500.0/img2.rows); 46 if(img2.empty()) perror; 47 else return img2; 48 mtx.unlock(); 49} 50 51 52 53 54 55int main(void) 56{ 57 int i; 58 59 std::thread th_0(multi_imread0); 60 std::thread th_1(multi_imread1); 61 std::thread th_2(multi_imread2); 62 63 th_0.join(); 64 th_1.join(); 65 th_2.join(); 66 ShowManyImages("IMAGE",3,th_0,th_1,th_2); 67}
自分で調べたことや試したこと
OpenCVはスレッドセーフな設計になっていないこと
multi_imread
のコードは恐らく大丈夫(簡単な例でやってみて動作したので)
使っているツールのバージョンなど補足情報
OpenCV2,C++14,thread
以上です.ご指摘のほどよろしくお願いいたします.
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/24 16:29