日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

opencv生成日志_OpenCV-Utils学习日志:VideoCapture使用样例

發(fā)布時間:2023/12/3 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv生成日志_OpenCV-Utils学习日志:VideoCapture使用样例 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.VideoCapture可以打開多種來源的數(shù)據(jù)流,但常見的是相機、視頻及圖像序列三類數(shù)據(jù)流:

(1)打開相機數(shù)據(jù)流,需要指定相機在主機上的設備編號,若主機上只有一個相機則編號通常是0。

(2)打開視頻數(shù)據(jù)流,需要指定視頻的完整路徑,如/root/data/vtest.avi。

(3)打開圖像序列流,需要指定圖像序列的完整路徑,其中路徑中的文件名的格式同C言語中prinf的格式,可參見《CV學習日志:C語言中文件IO使用要點》。如/root/data下有ima1.png、ima2.png、…、ima123.png,則給定的文件名為/root/data/ima%d.png;如/root/data下有ima001.png、ima002.png、…、ima123.png,則給定的名為/root/data/ima%03d.png,這里%03d表示圖像名序列號是整數(shù)、占寬三位、不足三位的高位是零填充。

2.VideoCapture常用的函數(shù)是構(gòu)造、read、set及get:

(1)構(gòu)造函數(shù):打開數(shù)據(jù)流。

(2)read函數(shù):讀一幀數(shù)據(jù)流。

(3)set函數(shù):設置VideoCapture屬性值,常用屬性是CAP_PROP_FRAME_HEIGHT和CAP_PROP_FRAME_WIDTH。

(4)get函數(shù):獲取VideoCapture屬性值,常用屬性是CAP_PROP_FRAME_HEIGHT和CAP_PROP_FRAME_WIDTH。

3.類AboutVideoCAP是VideoCapture的使用樣例,其功能如下:

(1)打開數(shù)據(jù)流功能:可打開相機、視頻或圖像序列,相機指定設備號、視頻和圖像序列指定完整路徑。

(2)保存數(shù)據(jù)流功能:按空格保存圖像到給定的目錄或默認的workDir/data,圖像名是時間戳,單位納秒。

(3)幀顯示時間設置功能:默認每幀顯示30毫秒,可指定為期望顯示的時間,其中設為零表示一直顯示直到按下任意鍵。

(4)幀高度寬度設置功能:對于相機數(shù)據(jù)流,可指定相機支持的尺寸,否則為相機默認的輸出尺寸。

可在https://github.com/opencv/opencv/tree/master/samples/data下載vtest.avi和left*.jpg測試視頻流和圖像序列。

也可參見關于VedioCapture和VideoWriter的綜合使用樣例《OpenCV-Utils學習日志:VideoWriter使用要點》。

以下是詳細代碼,依賴于C++14、OpenCV4.x和Spdlog。

1 #include

2 #include

3 #include

4 using namespacestd;5 using namespacecv;6

7 #ifndef StrPairKey8 #define StrPairKey(key) make_pair(#key, key)

9 #define StrPairVal(val) make_pair(val, #val)

10 #endif

11

12 classAboutVideoCAP13 {14 public:15 map> capProps =

16 {17 make_pair(0, StrPairVal(CAP_PROP_POS_MSEC)),18 make_pair(1, StrPairVal(CAP_PROP_POS_FRAMES)),19 make_pair(2, StrPairVal(CAP_PROP_FRAME_COUNT)),20 make_pair(3, StrPairVal(CAP_PROP_POS_AVI_RATIO)),21

22 make_pair(4, StrPairVal(CAP_PROP_FRAME_WIDTH)),23 make_pair(5, StrPairVal(CAP_PROP_FRAME_HEIGHT)),24 make_pair(6, StrPairVal(CAP_PROP_FPS)),25 make_pair(7, StrPairVal(CAP_PROP_FOURCC)),26 make_pair(8, StrPairVal(CAP_PROP_FORMAT)),27 make_pair(9, StrPairVal(CAP_PROP_MODE)),28

29 make_pair(10, StrPairVal(CAP_PROP_BRIGHTNESS)),30 make_pair(11, StrPairVal(CAP_PROP_HUE)),31 make_pair(12, StrPairVal(CAP_PROP_SATURATION)),32 make_pair(13, StrPairVal(CAP_PROP_CONTRAST)),33 make_pair(14, StrPairVal(CAP_PROP_GAIN)),34 make_pair(15, StrPairVal(CAP_PROP_EXPOSURE))35 };36

37 void TestMe(int argc = 0, char** argv = 0)38 {39 //0.GetParams

40 if (argc < 3) { spdlog::critical("Usage: appName streamFrom saveDir waitTime(Optional) deviceRows(Optional) deviceCols(Optional)"); return; }41 string imaFrom = argv[1];42 string saveDir = argv[2];43 int waitTime = 30; if (argc > 3) waitTime = atoi(argv[3]);44 int deviceRows = 0; if (argc > 4) deviceRows = atoi(argv[4]);45 int deviceCols = 0; if (argc > 5) deviceCols = atoi(argv[5]);46

47 //1.CreatDirectory

48 utils::fs::createDirectories(saveDir);49 spdlog::set_pattern("%v"); spdlog::info("imaFrom: {}\nsaveDir: {}\nwaitTime: {}\ndeviceRows: {}\ndeviceCols: {}", imaFrom, saveDir, waitTime, deviceRows, deviceCols);50

51 //2.OpenStream

52 VideoCapture cap;53 if (imaFrom.size() == 1)54 if (cap.open(atoi(imaFrom.c_str())) == false) { spdlog::critical("Failed to open device: {}", imaFrom); return; }55 if (imaFrom.size() > 1)56 if (cap.open(imaFrom) == false) { spdlog::critical("Failed to open file: {}", imaFrom); return; }57

58 //3.SetDevice

59 if (imaFrom.size() == 1 && argc > 4) cap.set(CAP_PROP_FRAME_HEIGHT, deviceRows);60 if (imaFrom.size() == 1 && argc > 5) cap.set(CAP_PROP_FRAME_WIDTH, deviceCols);61

62 //4.GetDevice

63 spdlog::info("cap.isOpened(): {}", cap.isOpened());64 spdlog::info("cap.getBackendName():", cap.getBackendName());65 for (map>::iterator it = capProps.begin(); it != capProps.end(); ++it)66 spdlog::info("cap.get({}): {}", it->second.second, cap.get(it->second.first));67

68 //5.ReadStream

69 cv::namedWindow(__FUNCTION__, WINDOW_NORMAL);70 spdlog::info("Press space to save one and q/Q to exit");71 Mat frame;72 while(cap.read(frame))73 {74 //5.1 ShowImage

75 cv::imshow(__FUNCTION__, frame);76 int c =cv::waitKey(waitTime);77 if (c == 'q' || c == 'Q') break;78

79 //5.2 SaveImage

80 if (c == ' ')81 {82 string savePath = saveDir + fmt::format("/{}.png", chrono::time_point_cast<:nanoseconds>(chrono::system_clock::now()).time_since_epoch().count());83 cv::imwrite(savePath, frame);84 spdlog::info("Saved to:" +savePath);85 }86 }87 cv::destroyWindow(__FUNCTION__);88 }89 };90

91 int main(int argc, char** argv) { AboutVideoCAP me; me.TestMe(argc, argv); return 0; }

View Code

總結(jié)

以上是生活随笔為你收集整理的opencv生成日志_OpenCV-Utils学习日志:VideoCapture使用样例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。