C 的心酸歷程

2021-10-04 17:19:02 字數 3362 閱讀 3348

好久沒有寫部落格了,因為我掉進了c的坑。從python轉c,是一條漫漫長路。主要的障礙是程式設計習慣,核心問題卻是自我設限。起初總感覺c很難,很抗拒,越是抗拒越是難。但是工作原因不得已而為之,堅持下來了。終於告別了對c的恐慌,故此值得記錄一下。此文只是簡單記錄一下,基礎的型別轉換、mkfifo的簡單使用以及cmake的使用,以便以後開發。

大佬說,流只是一種概念!大佬說的話要記下來!我利用mkfifo,其實就是一種管道,把檔案看成乙個佇列,一端只寫,一端唯讀,就會形成流。缺點卻是讀的速度太慢,會出現丟幀的現象。

新建乙個streamer_client.cpp:

//

// created by neuron-drop on 2020/4/1.

//extern "c"

#include #include #include using namespace cv;

using namespace std;

#define fifo_client "./fifo"

int main()

//以只寫方式開啟管道檔案

fd=open(fifo_client,o_wronly,0);

if(fd==-1)

// 使用opencv開啟攝像頭

videocapture cap("rtsp:");

mat frame;

if (cap.isopened() == false)

cout << "can't not capture an usb camera from your computer!!!" << endl;

while (1)

}close(fd); //關閉管道

return 0;

}

構建服務端,接收客戶端的資料。新建乙個streamer_server.cpp:

//

// created by neuron-drop on 2020/4/1.

//extern "c"

#include "opencv2/imgcodecs/legacy/constants_c.h"

#include #include #include #include using namespace cv;

using namespace std;

#define fifo "fifo"

mat bytestomat(byte * bytes)

int main()

// 給檔案以讀寫許可權,否則無法寫入

char cmd[100];

sprintf(cmd, "chmod 704 %s", fifo);

system(cmd);

fd = open(fifo, o_rdonly | o_nonblock, 0);

if (fd == -1)

// 根據相機的大小設定

byte * bytes = new byte[3000*4000*3];

while (1) else

}catch(const char* msg) }}

}// close(fd); //關閉管道

// pause(); /*暫停,等待訊號*/

// unlink(fifo); //刪除檔案

}

資料型別說明,對於初級c手,最痛苦的莫過於資料型別之間的轉換了。上面我是將byte直接寫入了檔案,對於c來說除了基本的資料型別以外,其他的資料型別可以理解成是一種基本型別的限制或者擴充套件,比如有int ,就會有short int或者 unsigned int等等。而byte,python開發會本能地反應是二進位制,其實它只是 typedef unsigned char byte;所以資料型別為uchar* data的frame.data寫入檔案後,卻可以使用byte去讀取它的原因。至於bytes轉mat,這裡就不贅述了,原因也很簡單,只不過是給mat結構體進行初始化罷了。

才恍然發現,原來c的資料型別如此簡單!只是我們開始學習的時候聽到別人說很難,所以進行的心理設限。

cmake是乙個強大的工具,能有效的節省了編譯的時間,但是對於新手來說一開始就使用它,的確困難重重,但是公司的大佬選擇使用了cmake,所以本人也不得已而為之。這裡推薦使用clion作為開發工具。

cmake_minimum_required(version 3.15)

project(createstreamer)

set(cmake_cxx_standard 14)

# find required opencv

find_package(opencv required)

# directory of opencv headers

include_directories($)

# name of executable file and path of source file

add_executable(server src/streamer_server.cpp)

add_executable(client src/streamer_client.cpp)

target_link_libraries(client $)

target_link_libraries(server $)

#查詢當前目錄下的所有原始檔,並將名稱儲存到 src 變數

#aux_source_directory(./src src)

#指定生成目標,第乙個引數為目標名,之後引數為原始檔列表

#add_executable(main src/main.cpp)

#新增第三方鏈結庫

#target_link_libraries(python_dvp dvp)

#生成鏈結庫檔案,三個引數分別是鏈結庫名、鏈結庫型別、原始碼檔案

#add_library(python_dvp shared src/python_ext.cpp)

#設定生成目錄

#set(library_output_path $)

# add_library(createstreamer shared src/python-api.c)

# set_target_properties(createstreamer properties prefix "")

# set_target_properties(createstreamer properties output_name python-api )

注釋裡面已經有了基本的使用說明了,這些對新手來說差不多就夠了。c++語言是比較優美的了,開發速度其實也不慢,至於說pyhton開發快,那是別人的api太多了,所以很多python開發只知道如何實現(流程),卻無法自己實現。所以python與c++,配合使用,也是一種不錯的選擇!

此次最大的感悟就是,不要自我設限!

建立個人部落格的心酸歷程

突然就是想到要搞乙個hexo部落格 next 主題 我也是抽瘋了。然後這幾天更是看了無數教程,踩了無數坑 其中一些是我的愚蠢造成的,難過 特別是昨天,從早上到晚上一點半。原來專心做一件事情的時候時間過得如此的快,不想恰飯,不想睡覺,哈哈哈哈。不過最後的結果還是令我滿意的。npm warn depre...

小白的心酸連網歷程

問題 wifi共享精靈網路連線口顯示已連線internet,但手機連線不上該熱點 具體操作 1.開啟 wifi 精靈以後,然後開啟網路和共享中心,設定電腦主網,單擊左鍵點開屬性,在彈出目標網路連線的屬性對話方塊,點選 共享 選項卡,選中對應的設定頁面中的 允許其他使用者通過此計算機的internet...

測試硬碟IO效能的心酸歷程

winsat disk drive c結果出來了後一閃而過,我想這不是和埠被占用時tomcat的症狀一樣嘛!果斷變成如下指令碼 winsat disk drive c pause 各位不要笑,有時候這個pause還是很有用的,but,然並卵,還是一閃而過。這時就要發揮我的聰明才智了,記得之前在自己的...