【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.mzph.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;不同类型的数据不…