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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++ opencv 将视频转化成字符串

發布時間:2023/12/8 c/c++ 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++ opencv 将视频转化成字符串 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

直接貼代碼,我在這個大佬(https://www.bilibili.com/video/BV1f5411t7oD)的代碼基礎上進行了修改

這是他的代碼:(方便你們更好的理解)

#include<stdio.h> #include<opencv2/opencv.hpp> #include<string> #include<vector> #include<windows.h>using namespace cv; using namespace std;int main() {VideoCapture video;Mat frame, gray;video.open("E:/黑人抬棺.mp4");int cols = video.get(CAP_PROP_FRAME_WIDTH);int rows = video.get(CAP_PROP_FRAME_HEIGHT);int framecount = video.get(CAP_PROP_FRAME_COUNT);int fps = video.get(CAP_PROP_FPS);int delty = 10;int deltx = 5;int value;int n = 0;char c[] = " .,-'`:!1&@#$";vector<string> v;HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos = { 0,0 };while (n < framecount){n++;video.read(frame);cvtColor(frame, gray, COLOR_BGR2GRAY);string s = "";for (int row = 0; row < rows - delty; row = row + delty){for (int col = 0; col < cols - deltx; col = col + deltx){value = gray.at<uchar>(row, col);s = s + c[int(value / 20)];}s = s + '\n';}v.push_back(s);system("cls");//建議不要在這里用,在下面輸出循環之前用,不然會很慢,請參考我的代碼printf("正在讀取:%d/%d", n, framecount);}for (int i = 0; i < v.size(); i++){SetConsoleCursorPosition(h, pos);cout << v[i];waitKey(1000 / fps);}return 0; }

我在原有基礎上,

  • 增加讀文件操作,方便那些不懂c++的人放自己喜歡的視頻,以及更改顯示的字符串和修改每秒顯示的幀數;并且可以自行設定字符串之間的間隔
  • 增加寫文件操作,將輸出字符串存到對應的文本文件中。(因為這樣的文本文件打開很大,并且可能打開時會卡住,所以請根據需要將這個文件留住或者刪除,不影響進程)
  • 將在棧區的數據都改成了堆區,強制類型轉換和指針用c++11的格式
  • 修復了導入某些視頻出bug的問題,即增加了通道判斷
  • 增加了注釋
  • 把代碼的所有警告都進行了修正(除了opencv的警告我不懂改不了以外)
  • 這個是沒有聲音的,聲音只能用其他庫去加,或者自己用視頻合成軟件去添加
  • 針對容器進行了優化,提前擴容,增加效率
  • 哪怕沒人看,我也要認真搞好><
  • #include<iostream> #include<fstream> #include<opencv2/opencv.hpp> #include<vector> #include<windows.h> #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/imgproc/types_c.h"using namespace cv; using namespace std;/*如果在opencv源代碼有警告,那就是opencv庫的原因,不影響具體效果,可以自行用最新的庫看看有沒有警告*/ int main() {//=================視頻路徑====================//cout << "注意要將視頻的路徑的\\改成/" << endl<<endl;ifstream ifs;ifs.open("MyVideo.txt", ios::in);if (!ifs.is_open()) {cout << "視頻文件沒有打開" << endl;return 0;//失敗就返回}char filePath[1024];ifs.getline(filePath, sizeof(filePath));ifs.close();unique_ptr<VideoCapture> video = make_unique<VideoCapture>(filePath);//=================更改信息====================//ifstream ifs3;ifs3.open("MyInfo.txt", ios::in);if (!ifs3.is_open()) {cout << "MyInfo文件沒有打開" << endl;return 0;//失敗就返回}vector<string> myInfoVector;myInfoVector.reserve(6);string myInfoString;while (ifs3 >> myInfoString) {//一個個單詞讀取數據//可以優化到只讀整數myInfoVector.push_back(myInfoString);}ifs3.close();//=================讀取視頻文件的數據====================//int cols = static_cast<int>(video->get(CAP_PROP_FRAME_WIDTH));int rows = static_cast<int>(video->get(CAP_PROP_FRAME_HEIGHT));//總幀數-1,最后一幀不要,否則可能報錯_int64 framecount = static_cast<_int64>(video->get(CAP_PROP_FRAME_COUNT))-1;HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos = { 0,0 };//起始位置int fps = static_cast<int>(video->get(CAP_PROP_FPS));int delty = atoi(myInfoVector[4].c_str());//每個字符間的高度int deltx = atoi(myInfoVector[5].c_str());//每個字符間的寬度int value;//灰度值_int64 n = 0;//=================字符串路徑====================//cout << "你可以在MyChar.txt文件中修改展現的字符串" << endl << endl;ifstream ifs2;ifs2.open("MyChar.txt", ios::in);if (!ifs2.is_open()) {cout << "字符串文件沒有打開" << endl;return 0;//失敗就返回}char filePath2[1024];ifs2.getline(filePath2, sizeof(filePath2));ifs2.close();string myChar(filePath2);//字符串路徑int myCharSize = static_cast<int>(myChar.size());//=================儲存對應的字符串====================//ofstream ofs;ifstream ifs_out_test;ifs_out_test.open("MyOut.txt", ios::in);if (!ifs_out_test.is_open()) {cout << "MyOut文件沒有打開" << endl << endl;ifs_out_test.close();}else {ifs_out_test.close();ofs.open("MyOut.txt", ios::out);}//=================存儲灰度值====================////===========對象創建放在循環外面,防止過多調用構造析構=====////用來存放輸出的字符unique_ptr<vector<string>> v = make_unique<vector<string>>();v->reserve(framecount);//節省擴容次數unique_ptr<Mat> frame = make_unique<Mat>();unique_ptr<Mat> gray = make_unique<Mat>();//用于存放字符串unique_ptr<string> s = make_unique<string>();int reservesize = (rows / delty) * (cols / deltx);s->reserve(reservesize);//提高效率while (n < framecount){n++;video->read(*frame);// 轉換單通道if (frame->channels() == 4) {s->clear();//clear不會刪除原來的內存地址,只會清空數據,用在這正好cv::cvtColor(*frame, *gray, CV_BGRA2GRAY);}else if (frame->channels() == 3) {s->clear();cv::cvtColor(*frame, *gray, CV_BGR2GRAY);}else if (frame->channels() == 2) {s->clear();cv::cvtColor(*frame, *gray, CV_BGR5652GRAY);}else {v->push_back(*s);//防止丟幀continue;//不這樣,當有的通道為 負數或1時會出bug}for (int row = 0; row < rows - delty; row = row + delty){for (int col = 0; col < cols - deltx; col = col + deltx){ value = gray->at<uchar>(row, col);//灰度值,0到255之間int index = (value * (myCharSize-1)) / 255 ;//記住-1,不然會越界s->push_back(myChar.at(index));//一定要用at,用[]越界了也不知道,一定會出bug}s->push_back('\n');}v->push_back(*s);printf("Now reading :%lld/%lld\n", n, framecount);}//=================顯示儲存的灰度值====================//system("cls");for (const auto& printValue : *v) {SetConsoleCursorPosition(h, pos);cout << printValue << endl;if (ofs.is_open()) {ofs << printValue << endl;}waitKey(atoi(myInfoVector[3].c_str()) / fps);//1000/25 或者1000/60//刷新間隔}if (ofs.is_open()) {ofs.close();}return 0; }

    注意事項:如果僅僅復制粘貼代碼,是無法運行的,必須配置opencv庫,至于怎么配置,可以看我的這個教程鏈接
    https://blog.csdn.net/bioinformatique/article/details/105655809

    下面是我打包后的exe文件,可以直接用,不需要安裝任何庫,不需要vs,解壓,按照說明,一定可以運行,

    (我在注意事項中詳細說明了怎么使用這個exe文件,非常簡單,并且你們可以隨意diy,不懂c++,不懂編程,也可以用我的exe文件將你們的視頻轉成字符串)

    鏈接:https://pan.baidu.com/s/10rajqK8OZi996LMoKthTBw
    提取碼:6r3o

    如果代碼對你有用,或者exe文件你用的很順手,麻煩點個贊

    成品如下

    總結

    以上是生活随笔為你收集整理的c++ opencv 将视频转化成字符串的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。