opencv_c++学习(三十)

news2024/11/24 20:31:31

一、加载深度神经网络模型

Net cv:dnn::readNet(const String & model, const String & config = "", const String & framework = "")

model:模型文件名称
config:配置文件名称
framework:框架种类
在这里插入图片描述
Net类中的函数名称以及作用:
在这里插入图片描述
向网络层中添加数据:

void cv::dnn::Net::setInput ( InputArray blob, const String & name = "", scalefactor =, double 1.0, const Scalar & mean = Scalar())

blob:新的输入数据,数据类型为CV_32F或CV_8U。
name:输入网络层的名称。
scalefactor:可选的标准化比例(尺寸缩放)。
mean:可选的减数数值(平移)。
opencv调用深度学习模型:

using namespace cv::dnn;

int main() {

	string model = "caffe_model.caffemodel";
	string config = "caffe_model.prototxt";

	//加载模型
	Net net = dnn::readNet(model, config); 
	if (net.empty())
	{
		cout << "请确认是否输入空的模型文件" << endl; 
		return -1;
	}

	// 获取各层信息
	vector<String> layerNames = net.getLayerNames();
	for (int i = 0; i < layerNames.size(); i++)
	{
		// 读取每层网络的ID
		int ID = net.getLayerId(layerNames[i]);
		// 读取每层网络的信息
		Ptr<Layer> layer = net.getLayer(ID);
		
		//输出网络信息
		cout << "网络层数; " << ID << "网络层名称:" << layerNames[i] << endl
		<< "网络层类型:" << layer->type.c_str() << endl;
	}
	return 0;
}

二、opencv使用深度学习模型

输入数据尺寸转换函数:

Mat cv::dnn::blobFromlmages ( InputArrayOfArrays images, scalefactor =, double 1.0, Size size = size(), mean =, const Scalar & Scalar(), swapRB=, bool false, bool crop = false, int ddepth = cv_32F)

images:输入图像,图像可以是单通道、三通道或者四通道。
scalefactor:图像像素缩放系数。
size:输出图像的尺寸。
mean:像素值去均值化的数值。
swapRB:是否交换三通道图像的第一个通道和最后一个通道的标志。
crop:调整大小后是否对图像进行剪切的标志。
ddepth:输出图像的数据类型,可选参数为CV_32F或CV_8U。
使用神经网络对图像进行分类:

int main() {

	//读取图片
	Mat src = imread("1.png");
	if (src.empty())
	{
		printf("不能打开空图片");
		return -1;
	}

	//读取分类种类名称
	String typeListFile = "image_recognition/imagenet_comp_graph_label_strings.txt";
	vector<String> typeList;
	ifstream file(typeListFile);
	if (!file.is_open())
	{
		printf("请确认分类种类名称是否正确");
		return -1;
	}

	std::string type;
	while (!file.eof())
	{
		//读取名称
		getline(file, type);
		if (type.length())
		{
			typeList.push_back(type);
		}
	}
	file.close();

	//加载网络
	String tf_pb_file = "imnge_recognition/tensorflom_inception_graph. pb ";
	Net net = readNet(tf_pb_file);
	if (net.empty())
	{
		printf("请确认模型文件是否为空文件");
		return -1;
	}

	//对输入图像数据进行处理
	Mat blob = blobFromImage(src, 1.0f, Size(224, 224), Scalar(), true, false);

	//进行图像种类预测
	Mat prob;
	net.setInput(blob, "input"); 
	prob = net.forward("softmax2");

	//得到最可能分类输出
	Mat probMat = prob.reshape(1, 1);
	Point classNumber;

	// 最大可能性
	double classProb;
	minMaxLoc(probMat, NULL, &classProb, NULL, &classNumber);
	string typeName = typeList.at(classNumber.x).c_str();
	cout << "图像中物体可能为: " <<typeName << "可能性为" << classProb;
	
	//检测内容
	string str = typeName + "possibility:" + to_string(classProb);
	putText(src, str, Point(50, 50), FONT_HERSHEY_SIMPLEX, 1.0, Scalar(0, 0, 255), 2, 8);
	imshow("图像判断结果", src);
	waitKey(0);
	return 0;
}

采用opencv进行图像风格迁移:

int main() {

	//读取图片
	Mat src = imread("1.png");
	if (src.empty())
	{
		printf("不能打开空图片");
		return -1;
	}

	//读取五个模型文件
	String models[5] = { "the_wave.t7","mosaic.t7","feathers.t7 ","candy.t7","udnie.t7"); 
		
	for (int i = 0; i < size(models); i++)
	{
		Net net = readNet("fest_style / " + models[i]);
		imshow("原始图像", src);

		//计算图像每个通道均值
		Scalar imgaeMean = mean(src);

		// 调整图像尺寸和格式
		Mat blobImage = blobFromImage(src, 1.0, Size(256, 256), imgaeMean, false, false);

		// 计算网络对原图像处理结果
		net.setInput(blobImage); 
		Mat output = net.forward();

		//输出结果的尺寸和通道数
		int outputChannels = output.size[1]; 
		int outputRows = output.size[2]; 
		int outputCols = output.size[3]; 

		// 将输出结果存放到图像中
		Mat result = Mat::zeros(Size(outputCols, outputRows),CV_32FC3); 
		float* data = output.ptr<float>();
		for (int channel = 0; channel < outputChannels; channel++)
		{
			for (int row = 0; row < outputRows; row++)
			{
				for (int col = 0; col < outputCols; col++)
				{
					result.at<Vec3f>(row, col)[channel] = *data++;
				}
			}
		}
		//对迁移结果进行进一步操作处理

		//恢复图像减掉的均值
		result = result + imgaeMean;

		//对图像进行归一化, 便于图像显示
		result = result / 255.0;

		//调整图像尺寸,使得与原图像尺寸相同
		resize(result, result, src.size());

		//显示结果
		imshow("result", result);
	}
}

采用两个不同的网络联系对图像进行处理,先检测人脸,在检测性别:

int main() {

	//读取图片
	Mat src = imread("1.png");
	if (src.empty())
	{
		printf("不能打开空图片");
		return -1;
	}

	// 读取人脸识别模型
	String model_bin = "face_age/ openev_face_detectar_uint8. pb";
	String config_text = "face_age / opencv_face_detector.pbtxt";
	Net faceNet = readNet(model_bin, config_text);

	//读取性别检测模型
	String genderProto = "face_age/gender_deploy.prototxt";
	String genderModel = "face_age/gendler_net.caffemodel";
	String genderList[] = { "Male", "Female" };

	Net genderNet = readNet(genderModel, genderProto);
	if (faceNet.empty() && genderNet.empty())
	{
		cout << "请确定是否输入正确的模型文件" << endl;
		return -1;
	}

	//对整幅图像进行人脸检测
	Mat blobImage = blobFromImage(src, 1.0, Size(300, 300), Scalar(), false, false);
	faceNet.setInput(blobImage, "data");
	Mat detect = faceNet.forward("detection_out");

	// 人脸概率、人脸矩形区域的位置
	Mat detectionMat(detect.size[2], detect.size[3], CV_32F, detect.ptr <float>());

	//对每个人脸区域进行性别检测
	// 每个人脸区域界个方向扩充的尺寸
	int exBoundray = 25;

	//判定定为人脸的概率阀值,阈值越大准确性越高
	float confidenceThreshold = 0.5;
	for (int i = 0; i < detectionMat.rows; i++)
	{
		//检测为人脸的概率
		float confidence = detectionMat.at<float>(i, 2);

		// 只检测概率大于阙恼区域的性别
		if (confidence > confidenceThreshold)
		{
			//网络检测人脸区域大小
			int topLx = detectionMat.at<float>(i, 3)* src.cols;
			int topLy = detectionMat.at<float>(i, 4)* src.rows;
			int bottomRx = detectionMat.at<float>(i, 5)*src.cols;
			int bottomRy = detectionMat.at<float>(i, 6)* src.rows;
			Rect faceRect(topLx, topLy, bottomRx - topLx, bottomRy - topLy);

			//将网络检测出的区域尺寸进行扩充,要注意防止尺寸在图像真实尺寸之外
			Rect faceTextRect;
			faceTextRect.x = max(0, faceRect.x - exBoundray);
			faceTextRect.y = max(0, faceRect.y - exBoundray);
			faceTextRect.width = min(faceRect.width + exBoundray, src.cols - 1);
			faceTextRect.height = min(faceRect.height + exBoundray, src.rows - 1);

			// 扩充后的人脸图像
			Mat face = src(faceTextRect);


			//调整面部图像尺寸
			Mat faceblob = blobFromImage(face, 1.0, Size(227, 227), Scalar(), false, false);

			// 将调整后的面部图像输入到性别检测网络
			genderNet.setInput(faceblob);

			// 计算检测结果
			//两个性别的可能性
			Mat genderPreds = genderNet.forward();

			//性别检测结果
			float male, female;

			male = genderPreds.at<float>(0, 0);
			female = genderPreds.at<float>(0, 1);
			int classID = male > female ? 0 : 1;
			String gender = genderList[classID];

			//在原图像中绘制面都轮廓和性别
			rectangle(src, faceRect, Scalar(0, 0, 255), 2, 8, 0);
			putText(src, gender.c_str(), faceRect.tl(), FONT_HERSHEY_SIMPLEX, 0.8, Scalar(0, 0, 255), 2, 8);
		}
	}
	imshow("结果", src);
	waitKey(0);
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Eplan使用过程中的知识点1

一、新建时的几种标准模板 EPLAN中的符号库符合国际标准&#xff0c;分为单线图和原理图符号库。 符号库符合GB&#xff08;国标&#xff09;、IEC&#xff08;国际标准&#xff09;、NFPA&#xff08;美国标准&#xff09;和GOST&#xff08;俄罗斯标准&#xff09;4大标准。…

排水管网监测预警系统:全面感知管网运行态势

城市排水管网是城市基础设施系统中至关重要的一部分&#xff0c;它负责将雨水和废水排出城市&#xff0c;维持城市的正常运行。然而&#xff0c;随着管网的老化和城市扩张&#xff0c;排水管网出现了越来越多的问题&#xff0c;如泄漏、堵塞和损坏&#xff0c;给城市环境和公共…

一、机器人传动方式

1、齿轮传动 齿轮的最重要属性就是它的齿数。齿轮是根据齿数分类的。齿轮通常不会单独使用&#xff0c;齿 轮的基本属性就是可以将运动从一根轴传到其它轴上。 利用齿轮改变转速 利用齿轮改变转动方向 将旋转运动改变为直线运动 带自锁的涡轮蜗杆传动 齿轮可以用来传递力、增加…

Python中打印彩色信息的方法

在Python中&#xff0c;可以使用print()函数打印出彩色信息。在使用print()打印之前&#xff0c;需要调用os标准库对系统进行设置。 1 os标准库 1.1 简介 os是Operating System的简写&#xff0c;即“操作系统”。os标准库是一个操作系统接口模块&#xff0c;提供了使用操作…

关于Addressable打包图集与图片都打进去造成冗余

1&#xff09;关于Addressable打包图集与图片都打进去造成冗余 ​2&#xff09;Unity如何计算Root动画旋转 3&#xff09;IL2CPP编译的Protobuf反射类运行时报空 4&#xff09;为什么Active Constraints会出现过高的现象 这是第337篇UWA技术知识分享的推送&#xff0c;精选了UW…

配置 ssh key 后 git 拉取代码一直提示输入用户名、密码问题

中间过程比较碎碎念&#xff0c;涉及到一些错误的方案以及和 gpt 对线 可以直接跳到结论部分 0 场景 我有一个项目&#xff0c;仓库里已经配置了 ssh 公钥&#xff0c;但是每次 pull 或者 push 代码依旧提示输入用户名、密码 -1 失败的方案 -1.1 失败的方案1&#xff1a;全…

迅为国产化RK3588开发板在安防前后端应用解决方案

K3588是瑞芯微推出的一款高性能处理器&#xff0c;针对安防领域的应用具备强大的计算能力和图像处理能力。下面是关于RK3588的安防前后端应用解决方案的介绍&#xff1a; 前端摄像头端&#xff1a; 高清视频采集&#xff1a;利用RK3588处理器的高性能图像处理能力&#xff0c;…

MySQL 对字符串使用 STR_TO_DATE() 函数

文章目录 STR_TO_DATE() 函数1. 待转换字符串中出现数字以外的&#xff0c;自动去除字符&#xff0c;然后添加0至8位转换为日期2. 如果格式字符串仅包含日期&#xff0c;则待转字符串至少需要 8 位数字3. 转换后日期时间必须有效&#xff0c;否则返回结果为 null4. 如果被转字符…

视频怎么加水印?如何录制带水印的视频?

案例&#xff1a;如何给视频添加水印&#xff1f; 【我发布在短视频平台的视频&#xff0c;总是被别人盗用&#xff0c;我想给自己的视频添加水印。有没有视频添加水印的方法&#xff1f;在线等&#xff01;】 很多视频制作者或者爱好者&#xff0c;都希望自己的视频作品得到…

OSPFv2特殊区域---NSSA区域

NSSA区域原理 NSSA区域 no-so-stub-area&#xff0c;次末梢区域。 NSSA区域能够将外部路由引入并传播到整个OSPF自治域中&#xff0c;同时又不会学习来自OSPF网络其它区域的5类LSA OSPF规定Stub区域是不能引入外部路由的&#xff0c;这样可以避免大量外部路由对Stub区域路由器…

我“Hack”了一款精酿啤酒

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 产品统筹 / bobo 联合制作 / 声网、CBCE 2023 录音间 / 声湃轩北京站 今天这位嘉宾的爱好非常广泛&#xff0c;除了自己是一位网络安全领域的从业者之外&#xff0c;平时还爱好攀…

Win32 API 编写一个串口助手

首先对串口操作做了一些封装: 助手类声明如下 CSerialPort.h #pragma once#include <string> #include <windows.h> #include <tchar.h>#ifdef _UNICODE using _tstring std::wstring; #else using _tstring std::string; #endifclass CSerialPort { pu…

JetBrains的Go语言集成开发环境GoLand 2023版本在Linux系统的下载与安装配置教程

目录 前言一、GoLand 安装二、使用配置总结 前言 GoLand是一款专为Go语言开发人员设计的集成开发环境&#xff08;IDE&#xff09;。它提供了丰富的功能和工具&#xff0c;可以帮助开发人员更高效地编写、调试和部署Go应用程序。注&#xff1a;已在CentOS7.9和Ubuntu20.04安装…

删除排序数组的重复项

给定一个排序数组&#xff0c;你需要在原地删除重复出现的元素&#xff0c;使得每个元素只出现一次&#xff0c;返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 示例 1: 给定数组 nums [1,1,2…

JavaEE进阶5/25(属性注入)

目录 1.更简单的存取Spring对象 2.获取Bean对象&#xff08;对象装配&#xff09;DI 3. Resource注入 4.Resource注入和Autowired注入的区别 1.更简单的存取Spring对象 2.获取Bean对象&#xff08;对象装配&#xff09;DI 对象装配&#xff08;对象注入&#xff09;有三种方…

含镍废水树脂吸附工艺方案

项目基本信息 工艺及产品信息 甲方 欣兴同泰科技(昆山)有限公司 采用工艺 沉淀工艺过滤系统离子交换放流池 工程公司 / 工艺原理 镍离子以氢氧化物的形式做成镍泥&#xff0c;清液中微量镍离子通过螯合离子交换原理实现出水稳定达标 开始时间 2019/6/20 工艺特点 …

遥感云大数据在灾害、水体与湿地领域典型案例实践及GPT模型

近年来遥感技术得到了突飞猛进的发展&#xff0c;航天、航空、临近空间等多遥感平台不断增加&#xff0c;数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量猛增&#xff0c;遥感数据已经越来越具有大数据特征。遥感大数据的出现为相关研究提供了前所未有的机遇&#xf…

TortoiseGit的安装及使用, 并配合Gitee码云使用

Windows10下, TortoiseGit的安装及使用, 并配合Gitee码云使用! 1) 安装TortoiseGit 官网, 32位, 64位, 自选 Download – TortoiseGit – Windows Shell Interface to Git 2) 点击下载, 安装, 我选择的是64位, 中文安装包(说明: 中文安装包也分32, 64位), 这两个下载. Tips:…

在ubuntu上安装splint

lint lint是最著名的C语言工具之一&#xff0c;是由贝尔实验室SteveJohnson于1979在PCC(PortableC Compiler)基础上开发的静态代码分析&#xff0c;一般由UNIX系统提供。 工具介绍 与大多数C语言编译器相比&#xff0c;lint可以对程序进行更加广泛的错误分析&#xff0c;是一…

2023数博会 | 李雨航:新一代数据安全国际实践,CSA引领数据安全3.0时代

5月26-28日&#xff0c;2023中国国际大数据产业博览会&#xff08;简称&#xff1a;数博会&#xff09;在贵州贵阳举办。大会由国家发展和改革委员会、工业和信息化部、国家互联网信息办公室和贵州省人民政府共同主办&#xff0c;是全球首个以大数据为主题的博览会。今年数博会…