【OpenCV】【XTerminal】talk程序運用和linux進程之間通信程序編寫,opencv圖像庫編程聯系

目錄

一、talk程序的運用&Linux進程間通信程序的編寫

1.1使用talk程序和其他用戶交流

1.2用c語言寫一個linux進程之間通信(聊天)的簡單程序

1.服務器端程序socket_server.c編寫

2.客戶端程序socket_client.c編寫

3.程序編譯與使用

二、編寫一個打開圖片進行特效顯示的代碼 test1.cpp

2.1 下載安裝 opencv

1 .下載安裝包并解壓

2 .使用 cmake安裝opencv

3. 使用make創建并編譯安裝

4. 配置環境

2.2 打開圖片進行特效顯示

1 .示例圖片

2. 具體過程

3 .相關問題


一、talk程序的運用&Linux進程間通信程序的編寫

1.1使用talk程序和其他用戶交流

首先我們通過who指令查詢,可以看到當前已經登錄用戶信息和終端

然后輸入talk指令連接對應用戶進行通信

talk username pts/

然后等待對方用戶連接

對面用戶會收到如下信息,然后輸入指令

talk username

完成后雙方可進行文字交流

白線上面部分為我發送的信息,下面部分為接收到的信息

交流結束后可通過“Ctrl+C"退出

但是當我們嘗試在talk程序下輸入中文進行交流時,會出現中文亂碼。所以接下來我們嘗試自己編寫一個c語言程序,實現Linux進程之間的通信。

1.2用c語言寫一個linux進程之間通信(聊天)的簡單程序

1.服務器端程序socket_server.c編寫

通過nano socket_server.c 新建服務器端程序文件,并進行如下代碼編寫。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <pthread.h>
?
#define PORT 8080
#define BUFFER_SIZE 1024
?
void *handle_client(void *arg) {int client_socket = *((int *)arg);char buffer[BUFFER_SIZE];int bytes_read;while (1) {bytes_read = read(client_socket, buffer, BUFFER_SIZE);if (bytes_read <= 0) {break;}buffer[bytes_read] = '\0';printf("Received: %s", buffer);printf("Enter reply (or 'exit' to quit): ");fgets(buffer, BUFFER_SIZE, stdin);if (strncmp(buffer, "exit", 4) == 0) {write(client_socket, "Server exiting...", 17);break;}write(client_socket, buffer, strlen(buffer));}close(client_socket);pthread_exit(NULL);
}
?
int main() {int server_fd, client_socket;struct sockaddr_in address;int opt = 1;int addrlen = sizeof(address);pthread_t thread_id;// 創建socket文件描述符if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {perror("socket failed");exit(EXIT_FAILURE);}// 設置socket選項if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {perror("setsockopt");exit(EXIT_FAILURE);}address.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(PORT);// 綁定socket到端口if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {perror("bind failed");exit(EXIT_FAILURE);}// 開始監聽if (listen(server_fd, 3) < 0) {perror("listen");exit(EXIT_FAILURE);}printf("Server started on port %d. Waiting for connections...\n", PORT);while (1) {// 接受新連接if ((client_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {perror("accept");continue;}printf("New connection from %s\n", inet_ntoa(address.sin_addr));// 為每個客戶端創建新線程if (pthread_create(&thread_id, NULL, handle_client, (void *)&client_socket) < 0) {perror("could not create thread");continue;}// 分離線程,使其結束后自動釋放資源pthread_detach(thread_id);}close(server_fd);return 0;
}

2.客戶端程序socket_client.c編寫

通過nano socket_client.c 新建客戶端代碼文件,并進行如下代碼編寫

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <pthread.h>
?
#define BUFFER_SIZE 1024
?
void *receive_messages(void *arg) {int sock = *((int *)arg);char buffer[BUFFER_SIZE];int bytes_read;while (1) {bytes_read = read(sock, buffer, BUFFER_SIZE);if (bytes_read <= 0) {printf("Server disconnected\n");exit(EXIT_SUCCESS);}buffer[bytes_read] = '\0';printf("\nReceived: %s", buffer);printf("Enter message (or 'exit' to quit): ");fflush(stdout);}return NULL;
}
?
int main(int argc, char const *argv[]) {if (argc != 2) {printf("Usage: %s <server_ip>\n", argv[0]);exit(EXIT_FAILURE);}int sock = 0;struct sockaddr_in serv_addr;char buffer[BUFFER_SIZE] = {0};pthread_t thread_id;// 創建socketif ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {perror("socket creation error");exit(EXIT_FAILURE);}serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(8080);// 將IP地址從字符串轉換為二進制形式if (inet_pton(AF_INET, argv[1], &serv_addr.sin_addr) <= 0) {perror("invalid address");exit(EXIT_FAILURE);}// 連接服務器if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {perror("connection failed");exit(EXIT_FAILURE);}printf("Connected to server at %s\n", argv[1]);// 創建接收消息的線程if (pthread_create(&thread_id, NULL, receive_messages, (void *)&sock) < 0) {perror("could not create thread");exit(EXIT_FAILURE);}// 主線程處理發送消息printf("Enter message (or 'exit' to quit): ");while (fgets(buffer, BUFFER_SIZE, stdin)) {if (strncmp(buffer, "exit", 4) == 0) {write(sock, "Client exiting...", 17);break;}write(sock, buffer, strlen(buffer));printf("Enter message (or 'exit' to quit): ");}close(sock);return 0;
}

3.程序編譯與使用

在服務器和客戶端機器上分別編譯:

# 服務器端
gcc socket_server.c -o server -lpthread
?
# 客戶端
gcc socket_client.c -o client -lpthread

接下來我們進行通訊嘗試:

在服務器機器上啟動服務器程序:

./server

在客戶端機器上啟動客戶端程序,指定服務器IP地址:

./client <服務器IP地址>

二、編寫一個打開圖片進行特效顯示的代碼 test1.cpp

2.1 下載安裝 opencv

1 .下載安裝包并解壓

下載安裝資源壓縮包

將下載好的壓縮包opencv-3.4.11放在主目錄文件夾下

解壓縮(打開虛擬機終端,輸入命令 unzip opencv-3.4.11.zip)

unzip opencv-3.4.11.zip

解壓縮以后主目錄文件夾如下:

進入到解壓后的文件夾中

cd opencv-3.4.11

2 .使用 cmake安裝opencv

(1)首先進入 root 用戶,并更新一下

sudo su
sudo apt-get update

(2)執行以下命令安裝 cmake

sudo apt-get install cmake

這里直接按enter鍵默認繼續安裝

(3)cmake安裝完成

(4)安裝依賴庫

sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev

(5)創建build文件夾,進入build文件夾

(6)使用cmake 編譯參數

cmake ..

運行結果如下:

3. 使用make創建并編譯安裝

(1)在build文件夾下進行

輸入以下命令

sudo make

(2)編譯完成

(3)安裝

輸入以下命令

sudo make install

(4)安裝完成

4. 配置環境

(1)修改 opencv.conf文件,打開后的文件是空的,添加opencv庫的安裝路徑:/usr/local/lib

輸入以下命令

sudo gedit /etc/ld.so.conf.d/opencv.conf

輸入路徑/usr/local/lib 并保存,記得點小叉叉退出文件編輯界面

出現警告是正常的

(2)更新系統共享鏈接

sudo ldconfig

(3)配置bash,修改 bash.bashrc 文件

輸入以下命令

sudo gedit /etc/bash.bashrc

(4)在文件末尾加入

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig export PKG_CONFIG_PATH

(5)然后執行以下命令使得配置生效

source /etc/bash.bashrc

(6)輸入以下命令更新

sudo updatedb

我輸入之后顯示找不到命令,好像是之前有個軟件包沒安裝成功

解決方法:

運行以下命令安裝 mlocate軟件包

sudo apt-get update sudo apt-get install mlocate

手動運行 updatedb

sudo updatedb

(7)查看 opencv 的版本信息

如下圖所示,說明安裝成功

2.2 打開圖片進行特效顯示

1 .示例圖片

2. 具體過程

(1)新建文件夾code

輸入以下命令創建新的文件夾

mkdir code cd code

(2)新建文件 test1.cpp

輸入以下命令新建 test1.cpp 文件

vim test1.cpp

(3)test1.cpp代碼

\#include <opencv2/highgui.hpp>
\#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{CvPoint center;double scale = -3; IplImage* image = cvLoadImage("lena.jpg");argc == 2? cvLoadImage(argv[1]) : 0;cvShowImage("Image", image);if (!image) return -1;  center = cvPoint(image->width / 2, image->height / 2);for (int i = 0;i<image->height;i++)for (int j = 0;j<image->width;j++) {double dx = (double)(j - center.x) / center.x;double dy = (double)(i - center.y) / center.y;double weight = exp((dx*dx + dy*dy)*scale);uchar* ptr = &CV_IMAGE_ELEM(image, uchar, i, j * 3);ptr[0] = cvRound(ptr[0] * weight);ptr[1] = cvRound(ptr[1] * weight);ptr[2] = cvRound(ptr[2] * weight);}Mat src;Mat dst;src = cvarrToMat(image);cv::imwrite("test.png", src);cvNamedWindow("test",1); ? imshow("test", src);cvWaitKey();return 0;
}

輸入代碼以后,按Esc 輸入 :wq保存退出

vim修改代碼,按i進入插入模式;按Esc再輸入 :wq 保存并退出

(4)把圖片粘貼到code目錄下

(5)編譯 test1.cpp 文件

g++ test1.cpp -o test pkg-config --cflags --libs opencv

(6)運行

輸入以下命令運行

./test

運行結果

3 .相關問題

1、請解釋 gcc test1.cpp -o test1 pkg-config --cflags --libs opencv這條編譯命令,它是如何獲得opencv頭文件、鏈接lib庫文件的路徑的?

命令解析: gcc:GNU 編譯器,用于編譯 C/C++ 程序。 test1.cpp:源代碼文件,包含 OpenCV 的代碼。 -o test1:指定輸出的可執行文件名稱為 test1。 pkg-config --cflags --libs opencv:這是一個子命令用于,動態獲取 OpenCV 的編譯和鏈接參數。 pkg-config:一個工具,用于查詢已安裝庫的編譯和鏈接參數。 --cflags:獲取 OpenCV 的頭文件路徑(-I 參數)。 --libs:獲取 OpenCV 的庫文件路徑(-L 參數)和庫名稱(-l 參數)。

(1)pkg-config --cflags --libs opencv 會返回 OpenCV 的頭文件路徑和庫文件路徑,例如:

-I/usr/local/include/opencv4 -L/usr/local/lib -lopencv_core -lopencv_imgproc -lopencv_highgui ...

(2)這些參數會被傳遞給 gcc,確保編譯器能夠找到 OpenCV 的頭文件和庫文件。

2、改用make+makefile方式編譯 上述程序(用變量命名格式寫makefile文件,并包括 clean選項)

將以下內容保存為 Makefile 文件,放在 code 目錄下

\# 定義變量
CXX = g++
CXXFLAGS = `pkg-config --cflags opencv`
LDFLAGS = `pkg-config --libs opencv`
SRC = test.cpp
OBJ = test.o
TARGET = test
?
\# 默認目標
all: $(TARGET)
?
\# 編譯規則
$(TARGET): $(OBJ)$(CXX) $(CXXFLAGS) $(LDFLAGS) -o $(TARGET) $(OBJ)
?
\# 生成對象文件
$(OBJ): $(SRC)$(CXX) $(CXXFLAGS) -c $(SRC) -o $(OBJ)
?
\# 清理
clean:rm -f $(OBJ) $(TARGET)

在終端運行以下命令

cd ~/code make

運行程序

./test

清理編譯文件

make clean

3、用cmake方式進行編譯

將以下內容保存為 CMakeLists.txt 文件,放在 ~/code 目錄下:

\# CMake 最低版本要求
cmake_minimum_required(VERSION 3.10)
?
\# 項目名稱
project(OpenCVTest)
?
\# 查找 OpenCV
find_package(OpenCV REQUIRED)
?
\# 添加可執行文件
add_executable(test test.cpp)
?
\# 鏈接 OpenCV 庫
target_link_libraries(test ${OpenCV_LIBS})

(1)在 ~/code 目錄下創建一個構建目錄并進入:

cd ~/code mkdir build cd build

(2)運行 cmake 和 make:

cmake .. make

編譯完成后,可執行文件 test 會生成在 build 目錄中

(3)運行程序

./test

(4)清理

刪除 build 目錄

rm -rf ~/code/build

4、對比總結

方式優點適用場景
直接 gcc簡單快速單文件小項目
Makefile支持多文件、變量管理、增量編譯中小型項目
CMake跨平臺、自動檢測依賴、適合大型項目大型或跨平臺項目

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76746.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76746.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76746.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【軟考系統架構設計師】信息系統基礎知識點

1、 信息的特點&#xff1a;客觀性&#xff08;真偽性&#xff09;、動態性、層次性、傳遞性、滯后性、擴壓性、分享性 2、 信息化&#xff1a;是指從工業社會到信息社會的演進與變革 3、 信息系統是由計算機硬件、網絡和通信設備、計算機軟件、信息資源、信息用戶和規章制度…

一種基于學習的多尺度方法及其在非彈性碰撞問題中的應用

A learning-based multiscale method and its application to inelastic impact problems 摘要&#xff1a; 我們在工程應用中觀察和利用的材料宏觀特性&#xff0c;源于電子、原子、缺陷、域等多尺度物理機制間復雜的相互作用。多尺度建模旨在通過利用固有的層次化結構來理解…

基于PyQt5的Jupyter Notebook轉Python工具

一、項目背景與核心價值 在數據科學領域,Jupyter Notebook因其交互特性廣受歡迎,但在生產環境中通常需要將其轉換為標準Python文件。本文介紹一款基于PyQt5開發的桌面級轉換工具,具有以下核心價值: 可視化操作:提供友好的GUI界面,告別命令行操作 批量處理:支持目錄遞歸…

圖論之并查集——含例題

目錄 介紹 秩是什么 例子——快速入門 例題 使用路徑壓縮&#xff0c;不使用秩合并 使用路徑壓縮和秩合并 無向圖和有向圖 介紹 并查集是一種用于 處理不相交集合的合并與查詢問題的數據結構。它主要涉及以下基本概念和操作&#xff1a; 基本概念&#xff1a; 集合&…

【數學建模】(智能優化算法)天牛須算法(Beetle Antennae Search, BAS)詳解與Python實現

天牛須算法(Beetle Antennae Search, BAS)詳解與Python實現 文章目錄 天牛須算法(Beetle Antennae Search, BAS)詳解與Python實現1. 引言2. 算法原理2.1 基本思想2.2 數學模型 3. Python實現4.實測效果測試1. Michalewicz函數的最小化測試2. Goldstein-Price函數的約束最小化 5…

【家政平臺開發(42)】筑牢家政平臺安全防線:安全測試與漏洞修復指南

本【家政平臺開發】專欄聚焦家政平臺從 0 到 1 的全流程打造。從前期需求分析,剖析家政行業現狀、挖掘用戶需求與梳理功能要點,到系統設計階段的架構選型、數據庫構建,再到開發階段各模塊逐一實現。涵蓋移動與 PC 端設計、接口開發及性能優化,測試階段多維度保障平臺質量,…

學習筆記八——內存管理相關

&#x1f4d8; 目錄 內存結構基礎&#xff1a;棧、堆、數據段Rust 的內存管理機制&#xff08;對比 C/C、Java&#xff09;Drop&#xff1a;Rust 的自動清理機制Deref&#xff1a;為什么 *x 能訪問結構體內部值Rc&#xff1a;多個變量“共享一個資源”怎么辦&#xff1f;Weak&…

ReliefF 的原理

&#x1f31f; ReliefF 是什么&#xff1f; ReliefF 是一種“基于鄰居差異”的特征選擇方法&#xff0c;用來評估每個特征對分類任務的貢獻大小。 它的核心問題是&#xff1a; “我怎么知道某個特征是不是重要&#xff1f;是不是有能力把不同類別的數據區分開&#xff1f;” 而…

?asm匯編源代碼之-漢字點陣字庫顯示程序源代碼下載?

漢字點陣字庫顯示程序 源代碼下載 文本模式下顯示16x16點陣漢字庫內容的程序(標準16x16字庫需要使用CHGHZK轉換過后才能使用本程序正常顯示) 本程序需要調用file.asm和string.asm中的子程序,所以連接時需要把它們連接進來,如下 C:\> tlink showhzk file string 調用參…

【已更新完畢】2025泰迪杯數據挖掘競賽B題數學建模思路代碼文章教學:基于穿戴裝備的身體活動監測

基于穿戴裝備的身體活動監測 摘要 本研究基于加速度計采集的活動數據&#xff0c;旨在分析和統計100名志愿者在不同身體活動類別下的時長分布。通過對加速度數據的處理&#xff0c;活動被劃分為睡眠、靜態活動、低強度、中等強度和高強度五類&#xff0c;進而計算每個志愿者在…

Ubuntu24.04裝機安裝指南

文章目錄 Ubuntu24.04裝機安裝指南一、分區說明二、基礎軟件三、使用fcitx5配置中文輸入法四、安裝搜狗輸入法【**不推薦**】1. 安裝fcitx2. 安裝輸入法 五、禁用/home目錄下自動生成文件夾六、更新軟件源1. 針對**新配置方式**的清華源替換方法2. 針對**老配置方式**的清華源替…

互聯網三高-數據庫高并發之分庫分表ShardingJDBC

1 ShardingJDBC介紹 1.1 常見概念術語 ① 數據節點Node&#xff1a;數據分片的最小單元&#xff0c;由數據源名稱和數據表組成 如&#xff1a;ds0.product_order_0 ② 真實表&#xff1a;再分片的數據庫中真實存在的物理表 如&#xff1a;product_order_0 ③ 邏輯表&#xff1a…

BM25、BGE以及text2vec-base-chinese的區別

BM25、BGE以及text2vec-base-chinese的區別 BM25 原理:BM25(Best Matching 25)是一種基于概率檢索模型的算法,它通過考慮查詢詞與文檔之間的匹配程度、文檔的長度等因素,來計算文檔對于查詢的相關性得分。具體來說,它會給包含查詢詞次數較多、文檔長度適中的文檔更高的分…

Python中try用法、內置異常類型與自定義異常類型拓展

目錄 try介紹與語法格式try具體使用案例except的異常類型簡介案例內置的常見異常類型自定義異常類型繼承關系用途 注意事項 try介紹與語法格式 在 Python 里&#xff0c;try 語句主要用于異常處理&#xff0c;其作用是捕獲并處理代碼運行期間可能出現的異常&#xff0c;避免程…

【第41節】windows的中斷與異常及異常處理方式

目錄 一、中斷與異常處理 1.1 中斷與異常 1.2 IDT 1.3 異常的概念 1.4 異常分類 二、windows異常處理方式 2.1 概述 2.2 結構化異常處理 2.3 向量化異常處理之VEH 2.4 向量化異常處理之VCH 2.5 默認的異常處理函數 2.6 如何手動安裝 SEH 節點 2.7 異常處理的優先級…

分布式日志治理:Log4j2自定義Appender寫日志到RocketMQ

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;精通Java編…

【HTML】html文件

HTML文件全解析&#xff1a;搭建網頁的基石 在互聯網的廣袤世界里&#xff0c;每一個絢麗多彩、功能各異的網頁背后&#xff0c;都離不開HTML文件的默默支撐。HTML&#xff0c;即超文本標記語言&#xff08;HyperText Markup Language&#xff09;&#xff0c;作為網頁創建的基…

oracle命令上下左右鍵無法使用如何解決?

1、問題如圖 2、解決辦法 (1) 安裝readline yum -y install readline* &#xff08;2&#xff09;安裝 rlwrap ##下載 wget http://files.cnblogs.com/files/killkill/rlwrap-0.30.tar.gz.zip ##解壓 tar -xzvf rlwrap-0.30.tar.gz.zip ##編譯安裝 ./configure make &&…

vue事假機制都有哪些

Vue 的事件機制主要包含以下幾種類型和方式&#xff0c;可以分為組件內部事件、父子組件通信事件、原生 DOM 事件封裝、修飾符增強等&#xff0c;下面詳細分類介紹&#xff1a; 一、DOM 事件綁定&#xff08;最基礎的事件&#xff09; 使用 v-on&#xff08;或簡寫 &#xff0…

系統編程2(消息隊列)

? 消息隊列概念 Linux系統中消息隊列&#xff08;Message Queue&#xff09;是進程間通信的一種方式&#xff0c;這種通信機制的好處是可以傳輸指定類型(用戶可以自行定義)的數據&#xff0c;相同類型的數據根據到達順序在隊列中進行排隊。 當然&#xff0c;不同類型的數據不…