c++视频图像处理

打开视频或摄像头

打开指定视频

	/*VideoCapture(const String &filename, apiPreference);filename:读取的视频或者图像序列的名称apiPreference:读取数据时设置的属性*/
VideoCapture video;  //定义一个空的视频对象
video.open("H:/BaiduNetdiskDownload/01.mp4");
// 判断视频有没有成功打开if (!video.isOpened()) {cout << "视频打开失败";return -1;}

打开摄像头

VideoCapture video(1);   //打开一个摄像头

视频的相关操作

通过get获取视频数据
在这里插入图片描述
将视频流赋值给mat对象

	Mat mat;video >> mat; bool isColor = (mat.type() == CV_8UC3);  //判断视频是否为3通道彩色

输出视频的帧率

cout <<"视频的帧率"<< video.get(CAP_PROP_FPS);

VideoWriter 视频写入

filename:保存视频的地址和文件名,包含视频格式
fourcc:压缩帧的4字符编解码器代码
fps:保存视频的帧率,即视频中每秒图像的张数
framSize:视频帧的尺寸
isColor:保存视频是否为彩色视频

	VideoWriter writer;int codec = VideoWriter::fourcc('M', 'J', 'P', 'G');  //选择MJPG的编码格式double fps = 25.0;  //设置视频的帧率string filename = "file.avi";	// 视频的名和格式writer.open(filename, codec, fps, mat.size(),isColor);   //创建保存文件的视频流if (!writer.isOpened()) {   // 判断视频流是否正常打开cout << "视频打开失败";return -1;}

保存视频中的数据

while (1) {   // 检查是否执行完毕   if (!video.read(video))  // 判断能否从摄像头或者视频文件中读出一帧图像{cout<<"摄像头或者视频读取完成"<<endl;break;}writer.write(video);  //把图像写入视频流    writer<<matimshow('live', video);  //显示图像 char c = waitKey(50);if (c == 27) {   //俺esc退出break;}}

颜色空间转换

三种存取数据的区间

  • 8U–存储0-255的数据类型
  • 32F–存储0-1(将0-1区间映射为0-255,大于1的部分映射为白色,小于0的部分映射为黑色)
  • 64F–存储0-1
    convertTo

m:输出图像
rtype:转换后数据类型
alpha:缩放系数
beta:平移系数
转换公式:alpha*I(x,y)+ beta

// 将0-255的图像转为0-1mat.convertTo(mat2, CV_32F, 1/255.0, 0);

RGB转灰度图公式:Gray=R0.3+G0.59+B*0.11

图像格式转换cvtColor

src:待转换颜色模型的原始图像
dst:转换颜色模型后的目标图像。
code:颜色空间转换的标志,如由RGB空间到HSV空间。
dstCn:目标图像中的通道数,如果参数为0,则从src和代码中自动导出通道数。

	Mat HSV;// 将RGB转为HSVcvtColor(mat, HSV, COLOR_BGR2HSV);

通道管理

split多通道分离

split(
InputArray m, //可以输入mat型
OutputArrayOfArrays mv
)
m:待分离的多通道图像
mv:分离后的单通道图像,为向量vector形式

merge多通道合并

merge(
InputArrayOfArrays mv,
OutputArray dst )
mv:需要合并的图像向量vector,其中每个图像必须拥有相同的尺寸和数据类型
dst:合并后输出的图像,通道数等于所有输入图像的通道数的总和

合并两个矩阵,取同一位置中较小的值

min(
InputArray src1,
InoytArray sec2,
OutputArray dst )

合并两个矩阵,取同一位置中较大的值

max(
InputArray src1,
InoytArray sec2,
OutputArray dst )

找出矩阵中的最值

minMaxLoc(
InputArray src, //输入单通道矩阵
CV_OUT double* minVal, //指向最小值的指针,如果不需要,则使用NULL
CV_OUT double* maxVal =0, //指向最大值的指针,如果不需要,则使用NULL
CV_OUT Point* minLoc =0, //指向最小值位置的指针,如果不需要,则使用NULL
CV_OUT Point* maxLoc = 0, //指向最大值位置的指针,如果不需要,则使用NULL
InputArray mask =noArray() //掩码矩阵,用于标记寻找上述四个值的范围,参数默认值为noArray,表示寻找范围是矩阵中所有数据
)

与或非运算

bitwise_not(						//非运算InputArray src,					//输入矩阵OutputArray dst,				//输出矩阵InputArray mask = noArray()		//掩码区域
)bitwise_and(					//与运算InputArray src1,			//输入矩阵1InputArray src2,			//输入矩阵2OutputArray dst,			// 输出矩阵InputArray mask = noArray());//掩码矩阵
bitwise_or(						//或运算InputArray src1,			//输入矩阵1InputArray src2,			//输入矩阵2OutputArray dst,			// 输出矩阵InputArray mask = noArray());//掩码矩阵
)

阈值化(二值化)

在这里插入图片描述
threshold( //图像二值化
InputArray src, //待二值化图像,图像只能是CV_8U和CV_32F两种数据类型
OutputArray dst, //二值化后的图像
double thresh, //阈值
double maxval, //二值化过程中的最大值,非必须参数
int type //二值化方式
);

adaptiveThreshold(			//自适应阈值化,只支持灰度图InputArray src,			//待二值化图像OutputArray dst,		//输出图像double maxValue,		//二值化的最大值int adaptiveMethod,		//自适应确定阈值的方法,分为均值法ADAPTIVE_THRESH_MEAN_C和高斯法ADAPTIVE_THRESH_GAUSSIAN_Cint thresholdType,		//选择二值化方法int blockSize,			//自适应确定阈值的像素邻域大小double C);				//从平均值或者加权平均值中减去的常数

LUT查找表
LUT(
InputArray src, //输入图像,类型只能是8U
InputArray lut, //256个像素的查找表,如果为多通道,通道数必须和输入图像通道数相同
OutputArray dst //输出矩阵,数据类型和查找表相同
);

图像尺寸缩放、翻转、拼接

resize(InputArray src,							//输入图像OutputArray dst,						//输出图像Size dsize,								//输出图像的尺寸double fx = 0,							//水平轴的比例因子,变为原来的几倍double fy = 0,							//垂直轴的比例因子int interpolation = INTER_LINEAR		//插值方法,INTER_AREA最近邻插值,INTER_LINEAR双线性插值,INTER_CUBIC三线性插值
);flip(   图像翻转InputArray src,		//输入图像OutputArray dst,	//输出图像int flipCode		//翻转方式标志,数值大于0表示绕y轴翻转,数值等于0表示围绕x轴翻转,数值小于0表示围绕两个轴翻转
);
resize(INTER_AREA,INTER_LINEAR,INTER_CUBIC)hconcat(//横向拼接InputArray src1,		// 输入图像 InputArray src2,		//输入图像,需要两个输入图像高度相同OutputArray dst			//输出图像
)	vconcat(//纵向拼接InputArray src1,		// 输入图像 InputArray src2,		//输入图像,需要两个输入图像高度相同OutputArray dst			//输出图像
)

仿射变换和旋转

// 仿射变换:由平移,缩放,旋转,翻转和错切组合得到,也叫三点变换

在这里插入图片描述

warpAffine(      仿射变换InputArray src,								//输入图像OutputArray dst,							//输出图像InputArray M,								//2*3变换矩阵,仿射变换矩阵Size dsize,									//输出图像尺寸int flags = INTER_LINEAR,					//插值方法标志int borderMode = BORDER_CONSTANT,			//像素边界外推方法的标志const Scalar& borderValue = Scalar());		//填充边界使用的数值,默认情况下为0

像素边界外推方法
BORDER_CONSTANT = 0,用特定值填充//!< iiiiii|abcdefgh|iiiiiii
BORDER_REPLICATE = 1,两端复制填充//!< aaaaaa|abcdefgh|hhhhhhh
BORDER_REFLECT = 2, 倒叙填充//!< fedcba|abcdefgh|hgfedcb
BORDER_WRAP = 3, 正序填充//!< cdefgh|abcdefgh|abcdefg
BORDER_REFLECT_101 = 4, 不包含边界值倒叙填充//!< gfedcb|abcdefgh|gfedcba
BORDER_TRANSPARENT = 5, //随机填充!< uvwxyz|abcdefgh|ijklmno
BORDER_REFLECT101 = BORDER_REFLECT_101, //!与BORDER_REFLECT_101相同
BORDER_DEFAULT = BORDER_REFLECT_101, //!与BORDER_REFLECT_101相同
BORDER_ISOLATED = 16 //!< 不关心感兴趣区域之外的部分

c++中并没有直接进行图像旋转的函数,需要求取一个旋转变换的仿射矩阵,通过仿射矩阵实现图像的旋转
getRotationMatrix2D( 图像旋转,返回一个2*3的矩阵
Point2f center, 图像旋转的中心位置
double angle, 图像旋转的角度,正值为逆时针旋转
double scale 两个轴的比例因子,可以实现旋转过程中的图像缩放,不缩放输入1
);
图像旋转的计算公式
在这里插入图片描述
三点对应方式计算仿射变换矩阵
getAffineTransform(
const Point2f src[], 原图像的三个点坐标
const Point2f dst[] 仿射变换后的三个点坐标
);

透视变换(透视投影,又叫四点变换)

在这里插入图片描述
从一个点出发把一个平面内人形状投影到另一个平面上
计算公式:
在这里插入图片描述
getPerspectiveTransform( 计算透视变换矩阵
const Point2f src[], 原图像中的三个坐标
const Point2f dst[], 目标图像中的三个像素坐标
int solveMethod = DECOMP_LU 计算透视变换矩阵的方法
);

	计算透视变换矩阵的方法DECOMP_LU = 0,			最佳主轴元素的高斯消元法 DECOMP_SVD = 1,			奇异值分解法 DECOMP_EIG = 2,			特征值分解法 DECOMP_CHOLESKY = 3,	Cholesky分解法DECOMP_QR = 4,			QR分解法DECOMP_NORMAL = 16		使用正规方程公式,可以去前面的标志一起使用warpPerspective(							透视变换函数InputArray src,							输入图像OutputArray dst,InputArray M,							3*3的透视变换矩阵Size dsize,								输出图像尺寸int flags = INTER_LINEAR,				插值方式 int borderMode = BORDER_CONSTANT,		像素边界外推方法的标志 const Scalar& borderValue = Scalar()	填充边界使用的数值,默认为0);

绘制图形

绘制直线

line(						InputOutputArray img,		//绘制的图像Point pt1,					//起点坐标Point pt2,					//终点坐标const Scalar& color,		//颜色int thickness = 1,			//宽度int lineType = LINE_8,		//边界类型int shift = 0				//中心坐标的半径数值中的小数点数
);	

边界类型:

	FILLED = -1,   填充型LINE_4 = 4, //!< 4-connected line    四连接LINE_8 = 8, //!< 8-connected line	8连接LINE_AA = 16 //!< antialiased line

绘制圆形

circle(InputOutputArray img,		Point center,		int radius,			半径长度const Scalar& color, int thickness = 1,		线的宽度,-1为绘制实心圆int lineType = LINE_8,int shift = 0
);

绘制椭圆

ellipse(InputOutputArray img, Point center,Size axes,double angle,			//椭圆旋转的角度double startAngle,		起始角度double endAngle,		终止角度const Scalar& color,int thickness = 1,int lineType = LINE_8, int shift = 0);

矩形绘制

	rectangle(InputOutputArray img,Point pt1, Point pt2,const Scalar& color, int thickness = 1,int lineType = LINE_8, int shift = 0);

绘制多边形

fillPoly(InputOutputArray img, const Point** pts,		所有顶点坐标(可以是多重数组,绘制多个多边形)const int* npts,		定点数int ncontours,			绘制的多边形的个数const Scalar& color, int lineType = LINE_8, int shift = 0,Point offset = Point());

绘制文字

putText(InputOutputArray img, const String& text, Point org,					//文字字符串左下角像素的坐标int fontFace, double fontScale, Scalar color,int thickness = 1, int lineType = LINE_8,bool bottomLeftOrigin = false
);

ROI分割和拷贝

img(Range(int start,	//区间的开始int end;	//区间的结束	),Range(int start,	//区间的开始int end;	//区间的结束	)
)Rect_(_Tp _x,						//左上角x坐标_Tp _y,						//左上角y坐标_Tp _width,					//宽_Tp _height)				//高

矩阵存储图
在这里插入图片描述
浅拷贝:只拷贝矩阵头
mat1=mat2
深拷贝:拷贝所有内容

cv::copyTo
copyTo(InputArray src,OutputArray dst, InputArray mask);Mat::copyToMat mat1;mat.copyTo(OutputArray dst,InputArray mask) const

图像金字塔

高斯图像金字塔:不断下采样
拉普拉斯金字塔:第k层的高斯图像下采样,再上采样,然后上采样和第k层的高斯图像求和得到拉普拉斯金字塔

pyrDown(		//下采样InputArray src, OutputArray dst,const Size& dstsize = Size(), int borderType = BORDER_DEFAULT			//填充方式);pyrUp(		上采样InputArray src,OutputArray dst,const Size& dstsize = Size(), int borderType = BORDER_DEFAULT);

创建滑动条和鼠标监控

创建滑动条

createTrackbar(const String& trackbarname, const String& winname,			//创建滑动条的窗口的名称int* value,						//反应当前滑块的位置int count,						//最大值TrackbarCallback onChange = 0,	//回调函数void* userdata = 0				//传递给回调函数的参数);

案例代码

Mat img;void callBack(int value, void*) {float a = value / 100;Mat img2 = img * a;imshow("img", img2);
}int main()
{img = imread("H:/1732413934315.png");namedWindow("img");imshow("img", img);int value = 100;createTrackbar("滑动条名称","img",&value,200,callBack,0);waitKey(0);return 0;
}

鼠标监控

setMouseCallback(		鼠标时间响应函数const String& winname, MouseCallback onMouse, void* userdata = 0)MouseCallback(int event,			鼠标响应事件标志,瞬间动作int x, int y, int flags,			鼠标相应标识,长时间的操作void* userdata		传递给回调函数的可选参数)鼠标响应时间标志enum MouseEventTypes {EVENT_MOUSEMOVE = 0, //!< 鼠标指针再窗口上移动EVENT_LBUTTONDOWN = 1, //!<按下鼠标左键EVENT_RBUTTONDOWN = 2, //!< 按下鼠标右键EVENT_MBUTTONDOWN = 3, //!< 按下鼠标中键EVENT_LBUTTONUP = 4, //!< 释放鼠标左键EVENT_RBUTTONUP = 5, //!< 释放鼠标右键EVENT_MBUTTONUP = 6, //!< 释放鼠标中键EVENT_LBUTTONDBLCLK = 7, //!< 双击鼠标左键EVENT_RBUTTONDBLCLK = 8, //!< 双击鼠标右键EVENT_MBUTTONDBLCLK = 9, //!< 双击鼠标中键EVENT_MOUSEWHEEL = 10,//!< 正值表示向前滚动,负值表示向后滚动EVENT_MOUSEHWHEEL = 11 //!< 正值表示向左滚动,负值表示向右滚动鼠标相应标识EVENT_FLAG_LBUTTON = 1, //!< 按住左键拖拽EVENT_FLAG_RBUTTON = 2, //!< 按住右键拖拽EVENT_FLAG_MBUTTON = 4, //!< 按住中键拖拽EVENT_FLAG_CTRLKEY = 8, //!< 按下ctrl键EVENT_FLAG_SHIFTKEY = 16,//!< 按下SHIFT键EVENT_FLAG_ALTKEY = 32 //!< 按下ALT键normalize(   归一化InputArray src, OutputArray dst, double alpha = 0, double beta = 1, int norm_type = NORM_MINMAX, int dtype = -1, InputArray mask = noArray()
);NORM_MINMAX: 数组的数值被线性变换到alpha和beta之间(通常是0到1)。NORM_L2 : :归一化后的值 = 像素值 / sqrt(所有像素值平方和)NORM_INF : 归一化后的值 = 像素值 / 最大绝对值像素值NORM_L1 : 归一化后的值 = 像素值 / (所有像素值绝对值的和)calcHist(     统计图像像素const Mat* images,int nimages,const int* channels, //需要统计哪些区域InputArray mask,SparseMat& hist, int dims,const int* histSize, const float** ranges,		//每个图像通道中灰度值的取值范围bool uniform = true,		//直方图是否均匀bool accumulate = false		//是否累积统计直方图,是否分别统计每个通道
);equalizeHist(          直方图均衡化InputArray src,		输入图像必须是8UC1OutputArray dst);LUTLUT(图像直方图匹配,将图像分布映射为指定分布InputArray src, InputArray lut,			变换矩阵OutputArray dst
);matchTemplate(InputArray image,				只能为8U或32F格式,两个输入图像类型必须相同InputArray templ,OutputArray result,int method,						匹配方法 InputArray mask = noArray());匹配方法
TM_SQDIFF = 0,        平方差匹配法 TM_SQDIFF_NORMED = 1,	归一化平方差匹配法 TM_CCORR = 2,			相关匹配法TM_CCORR_NORMED = 3,	归一化相关匹配法 TM_CCOEFF = 4,			系数匹配法 TM_CCOEFF_NORMED = 5	归一化相关系数匹配法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/478124.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端三剑客(二):CSS

目录 1. CSS 基础 1.1 什么是 CSS 1.2 语法格式 1.3 引入方式 1.3.1 行内样式 1.3.2 内部样式 1.3.3 外部样式 1.4 CSS 编码规范 2. 选择器 2.1 标签选择器 2.2 id 选择器 2.3 class 选择器(类选择器) 2.4 复合选择器 2.5 通配符选择器 3. 常用 CSS 样式 3.1 c…

udp_socket

文章目录 UDP服务器封装系统调用socketbind系统调用bzero结构体清0sin_family端口号ip地址inet_addrrecvfromsendto 新指令 netstat -naup (-nlup)包装器 的两种类型重命名方式包装器使用统一可调用类型 关键字 typedef 类型重命名系统调用popen关于inet_ntoa UDP服务器封装 系…

【LLM训练系列02】如何找到一个大模型Lora的target_modules

方法1&#xff1a;观察attention中的线性层 import numpy as np import pandas as pd from peft import PeftModel import torch import torch.nn.functional as F from torch import Tensor from transformers import AutoTokenizer, AutoModel, BitsAndBytesConfig from typ…

解!决!vscode!Path Intellisense 失效!不起作用问题!!

第一步&#xff1a;找到path Intellisense插件 点击设置 第二步&#xff1a;打开settings.json文件&#xff1a; 第三步&#xff1a;配置settings.json文件内容&#xff1a; "path-intellisense.mappings": {"": "${workspaceRoot}/src",&qu…

力扣 LeetCode 110. 平衡二叉树(Day8:二叉树)

解题思路&#xff1a; 等于 -1 时&#xff0c;直接 return -1 class Solution {public boolean isBalanced(TreeNode root) {return getHeight(root) ! -1;}public int getHeight(TreeNode root) {if (root null) return 0;int leftDepth getHeight(root.left);if (leftDep…

ros2学习日记_241124_ros相关链接

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…

【TEST】Apache JMeter + Influxdb + Grafana

介绍 使用Jmeter发起测试&#xff0c;测试结果存入Influxdb&#xff0c;Grafana展示你的测试结果。 环境 windows 10docker desktopJDK17 安装 Apache JMeter 访问官网&#xff08;Apache JMeter - Apache JMeter™&#xff09;下载JMeter&#xff08;目前最新版本5.6.3&a…

【隐私计算大模型】联邦深度学习之拆分学习Split learning原理及安全风险、应对措施以及在大模型联合训练中的应用案例

Tips&#xff1a;在两方场景下&#xff0c;设计的安全算法&#xff0c;如果存在信息不对等性&#xff0c;那么信息获得更多的一方可以有概率对另一方实施安全性攻击。 1. 拆分学习原理 本文介绍了一种适用于隐私计算场景的深度学习实现方案——拆分学习&#xff0c;又称分割…

汽车HiL测试:利用TS-GNSS模拟器掌握硬件性能的仿真艺术

一、汽车HiL测试的概念 硬件在环&#xff08;Hardware-in-the-Loop&#xff0c;简称HiL&#xff09;仿真测试&#xff0c;是模型基于设计&#xff08;Model-Based Design&#xff0c;简称MBD&#xff09;验证流程中的一个关键环节。该步骤至关重要&#xff0c;因为它整合了实际…

Vue——响应式数据,v-on,v-bind,v-if,v-for(内含项目实战)

目录 响应式数据 ref reactive 事件绑定指令 v-on v-on 鼠标监听事件 v-on 键盘监听事件 v-on 简写形式 属性动态化指令 v-bind iuput标签动态属性绑定 img标签动态属性绑定 b标签动态属性绑定 v-bind 简写形式 条件渲染指令 v-if 遍历指令 v-for 遍历对象的值 遍历…

Redis 常用数据类型插入性能对比:循环插入 vs. 批量插入

Redis 是一款高性能的键值数据库&#xff0c;其支持多种数据类型&#xff08;String、Hash、List、Set、ZSet、Geo&#xff09;。在开发中&#xff0c;经常会遇到需要插入大量数据的场景。如果逐条插入&#xff0c;性能会显得较低&#xff0c;而采用 Pipeline 批量插入 能大幅提…

开源动态表单form-create-designer 扩展个性化配置的最佳实践教程

在开源低代码表单设计器 form-create-designer 的右侧配置面板里&#xff0c;field 映射规则为开发者提供了强大的工具去自定义和增强组件及表单配置的显示方式。通过这些规则&#xff0c;你可以简单而高效地调整配置项的展示&#xff0c;提升用户体验。 源码地址: Github | G…

Java语言编程,通过阿里云mongo数据库监控实现数据库的连接池优化

一、背景 线上程序连接mongos超时&#xff0c;mongo监控显示连接数已使用100%。 java程序报错信息&#xff1a; org.mongodb.driver.connection: Closed connection [connectionId{localValue:1480}] to 192.168.10.16:3717 because there was a socket exception raised by…

深入浅出分布式缓存:原理与应用

文章目录 概述缓存分片算法1. Hash算法2. 一致性Hash算法3. 应用场景Redis集群方案1. Redis 集群方案原理2. Redis 集群方案的优势3. Java 代码示例:Redis 集群数据定位Redis 集群中的节点通信机制:Gossip 协议Redis 集群的节点通信:Gossip 协议Redis 集群的节点通信流程Red…

Loom篇之java虚拟线程那些事儿

我们在之前的文章中提到了java推出纤程的背景和原因。在近三十年来&#xff0c;Java 开发人员一直依赖线程作为并发服务器应用程序的构建块。每个方法中的每个语句都在线程内执行&#xff0c;并且由于 Java 是多线程的&#xff0c;因此多个执行线程会同时发生。线程是 Java 的并…

自然语言处理: RAG优化之Embedding模型选型重要依据:mteb/leaderboard榜

本人项目地址大全&#xff1a;Victor94-king/NLP__ManVictor: CSDN of ManVictor git地址&#xff1a;https://github.com/opendatalab/MinerU 写在前面: 笔者更新不易&#xff0c;希望走过路过点个关注和赞&#xff0c;笔芯!!! 写在前面: 笔者更新不易&#xff0c;希望走过路…

如何选择服务器

如何选择服务器 选择服务器时应考虑以下几个关键因素&#xff1a; 性能需求。根据网站的预期流量和负载情况&#xff0c;选择合适的处理器、内存和存储容量。考虑网站是否需要处理大量动态内容或高分辨率媒体文件。 可扩展性。选择一个可以轻松扩展的服务器架构&#xff0c;以便…

Spring 框架七大模块(Java EE 学习笔记03)

​ ​核心容器模块&#xff08;Core Container&#xff09; 核心容器模块在Spring的功能体系中起着支撑性作用&#xff0c;是其他模块的基石。核心容器层主要由Beans模块、Core模块、Contex模块和SpEL模块组成。 &#xff08;1&#xff09;Beans模块。它提供了BeanFactory类&…

2025-2026财年美国CISA国际战略规划(下)

文章目录 前言四、加强综合网络防御&#xff08;一&#xff09;与合作伙伴共同实施网络防御&#xff0c;降低集体风险推动措施有效性衡量 &#xff08;二&#xff09;大规模推动标准和安全&#xff0c;以提高网络安全推动措施有效性衡量 &#xff08;三&#xff09;提高主要合作…

【大数据技术与开发实训】携程景点在线评论分析

景点在线评论分析 题目要求实验目标技术实现数据采集获取所有相关景点页面的 URL获取所有相关景点对应的 poiId 及其他有用信息通过 poiId 获取所有景点的全部评论数据采集结果 数据预处理景点信息的数据预处理查看数据基本信息缺失值处理 用户评论的数据处理缺失值处理分词、去…