OpenCV入门例程:裁剪图片、模糊检测、黑屏检测

news2024/11/19 7:49:00

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。


        本例程运行环境为CentOS7,64位。代码很简单,三个函数分别裁剪图片、模糊检测、黑屏检测,最后是测试代码。(这个代码应该也是可以在windows上运行的,不确定是不是要经过修改)

        需要预先安装OpenCV4。

目录

一、编译参数

二、代码结构(省略的部分在后面)

三、裁剪图片

四、模糊检测

五、黑屏检测

六、测试代码

七、附加说明


一、编译参数

         在OpenCV官网下载安装:

        注意,本人所用版本没有这么新,不过应该不影响。 

        程序使用OpenCV需要头文件和库:

头文件包含目录,按照你的安装位置
-I /usr/local/include/opencv4/
链接库,这是全部,程序本身应该不需要链接这么多
 -lopencv_core -lopencv_imgcodecs -lopencv_highgui -lopencv_calib3d -lopencv_dnn -lopencv_features2d \
 -lopencv_flann -lopencv_imgproc -lopencv_ml -lopencv_objdetect -lopencv_photo -lopencv_stitching 

        如果不知道安装到哪里了,用find搜索一下就可以了。 

二、代码结构(省略的部分在后面)

#include "opencv2/opencv.hpp"
#include <opencv2/imgproc/types_c.h>
using namespace cv;

//图像处理类
class CMyPic
{
private:
public:
	//裁剪图片
	static bool ClipPic(char const* infile, int x, int y, int width, int heigh, char const* outfile)
	{
		。。。。。。
	}
	//模糊检测
	static double isImageBlurry(cv::Mat& img)
	{
		。。。。。
	}
	// cast 占比值,阈值为0.85,占比大于阈值认为黑屏
	static double detect_blackscreen(cv::Mat input_img)
	{
		。。。。。。
	}
	static bool CMyPic_test()
	{
		。。。。。。
	}
};

        三个功能三个函数,还有一个是测试。其实四个函数都是独立的,并不需要包装起来。

三、裁剪图片

	//裁剪图片
	static bool ClipPic(char const* infile, int x, int y, int width, int heigh, char const* outfile)
	{
		Mat pic = imread(infile);
		if (NULL == pic.data)
		{
			thelog << "imread失败" << ende;
			return false;
		}
		Rect rect(x, y, width, heigh);
		Mat newpic = pic(rect);
		if (NULL == newpic.data)
		{
			thelog << "剪切失败" << ende;
			return false;
		}
		if (!imwrite(outfile, newpic))
		{
			thelog << "imwrite失败" << ende;
			return false;
		}
		return true;
	}

        裁剪图片不在后面的测试代码中,因为这个代码一直在使用,所以也不用测试。

        功能很简单,打开输入文件,读取RECT范围到新图片,输出到outfile,文件格式OpenCV会根据文件后缀名自动处理。

        用到的几个OpenCV功能:

  • imread(文件名) 读取图片文件到Mat结构,根据文件扩展名自动识别格式
  • Mat::Mat(RECT) 剪切图片……这也太简单了
  • imwrite(文件名,Mat对象) 写文件,根据文件扩展名自动选择输出格式

四、模糊检测

	//模糊检测
	static double isImageBlurry(cv::Mat& img)
	{
		cv::Mat matImageGray;
		// converting image's color space (RGB) to grayscale
		cv::cvtColor(img, matImageGray, CV_BGR2GRAY);
		cv::Mat dst, abs_dst;
		cv::Laplacian(matImageGray, dst, CV_16S, 3);
		cv::convertScaleAbs(dst, abs_dst);
		cv::Mat tmp_m, tmp_sd;
		double m = 0, sd = 0;
		//int threshold = 1000;
		cv::meanStdDev(dst, tmp_m, tmp_sd);
		m = tmp_m.at<double>(0, 0);
		sd = tmp_sd.at<double>(0, 0);
		return (sd * sd);
	}

        这个就有点复杂了,先转换成灰度,再执行拉普拉斯算子,然后……好吧,其实我也不懂。

        用到的几个OpenCV功能:

  • cvtColor 转换颜色
  • Laplacian 拉普拉斯算子
  • convertScaleAbs 取绝对值
  • meanStdDev 计算平均值和标准差

五、黑屏检测

	// cast 占比值,阈值为0.85,占比大于阈值认为黑屏
	static double detect_blackscreen(cv::Mat input_img)
	{
		cv::Mat gray_img;
		cv::cvtColor(input_img, gray_img, CV_BGR2GRAY);

		long dark_sum = 0;
		for (long i = 0; i < gray_img.rows; ++i)
		{
			for (long j = 0; j < gray_img.cols; ++j)
			{
				if (gray_img.at<uchar>(i, j) < 20)
				{
					++dark_sum;
				}
			}
		}

		return dark_sum / double(gray_img.total());
	}

        先转换成灰度,再计算灰度小于20的点的占比。 返回的是占比,跟阈值比较即可。

        这个算法只用到了转换颜色cvtColor。

六、测试代码

	static bool CMyPic_test()
	{
		struct dirent* drip;
		DIR* dp;
		string dirname="目录";

		if ((dp = opendir(dirname.c_str())) == NULL)
		{
			thelog << "Error open dir " << dirname << " : " << strerror(errno) << ende;
			return false;
		}
		int ret = 0;
		while ((drip = readdir(dp)) != NULL)
		{
			if (strcmp(drip->d_name, ".") == 0 || strcmp(drip->d_name, "..") == 0)
			{
				continue;
			}

			string fullname;
			fullname = dirname + "/" + drip->d_name;
			//thelog<<fullname<<endi;
			bool isdir = IsDir(fullname.c_str());
			if (isdir)
			{
				thelog << fullname << "是个目录" << endi;
				continue;
			}

			string ext = ".jpg";//任务文件扩展名
			int d_name_len = strlen(drip->d_name);
			if (0 != strcmp(ext.c_str(), drip->d_name + d_name_len - ext.size()))
			{
				continue;
			}

			Mat pic = imread(fullname.c_str());
			if (NULL == pic.data)
			{
				thelog << "imread失败" << ende;
				return false;
			}
			
			//检测模糊
			double Blurry = isImageBlurry(pic);
			if (Blurry < 1000)
			{
				thelog << fullname << "模糊 " << Blurry << endi;
			}
			else
			{
				//thelog << fullname<< "不模糊" << endi;
			}
			//检测黑屏
			double Black = detect_blackscreen(pic);
			if (Black > 0.85)
			{
				thelog << fullname << "黑屏 " << Black << endi;
			}
			else
			{
				//thelog << fullname << "不黑屏" << endi;
			}

			char buf[128];
			sprintf(buf, ".%ld.%ld.jpg", (long)Blurry, (long)(Black*100));
			if (!imwrite(((string)drip->d_name + buf).c_str(), pic))
			{
				thelog << "imwrite失败" << ende;
				return false;
			}
		}
		closedir(dp);

		thelog << dirname << " 处理完毕" << endi;
		return true;
	}

        这个测试代码读取目录下的所有文件输出判断结果。 

七、附加说明

        测试代码用到了thelog,功能就是日志输出,替换为cout,ende和endi替换为endl即可。

        操作目录的部分需要包含头文件dirent.h。IsDir的实现是这样的:

		bool IsDir(char const * strPathName)
		{
			struct stat statBuf;

			if (stat(strPathName, &statBuf) == -1)
			{//这里总是返回-1,不知道是什么原因
				cout << "stat error : " << strPathName << " " << strerror(errno) << endl;
				return false;
			}

			return(statBuf.st_mode & S_IFDIR);
		}

        这个函数似乎有BUG,没搞清怎么回事,这个代码以前是可以用的,也不知道怎么回事,不过不影响测试代码的主要目的。


(这里是文档结束)

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

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

相关文章

vLLM介绍

vLLM是伯克利大学LMSYS组织开源的大语言模型高速推理框架&#xff0c;旨在极大地提升实时场景下的语言模型服务的吞吐与内存使用效率。vLLM是一个快速且易于使用的库&#xff0c;用于 LLM 推理和服务&#xff0c;可以和HuggingFace 无缝集成。vLLM利用了全新的注意力算法「Page…

SimpleMind Pro 2.3.4中文激活版 思维导图

SimpleMind是一款设计精美、功能齐全的跨平台思维导图软件。它是一个功能强大的优秀的软件工具&#xff0c;可用于头脑风暴的跨平台思维导图。当你和你的朋友坐在一起讨论不同的想法时&#xff0c;你可以很容易地记录下它们&#xff0c;并随时修改它们。思维导图可以帮助你思考…

win10电脑无线网卡优化

近期win10会频繁断网&#xff0c;无任何规律。目前整理搜索后使用以下两种方法优化网卡&#xff0c;更改配置后断网问题得到有效改善。 方法一&#xff1a;在【电源管理】中取消勾选【允许计算机关闭此设备以节约电源】 方法二&#xff1a;【Preferred enable】修改为prefer 5…

c# wpf style 简单试验

1.概要 wpf style 用来控制控件的样式 2.代码 <Window x:Class"WpfApp2.Window5"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.…

Linux操作系统之防火墙、redis安装

目录 一、防火墙 1、防火墙的类别 2、安装iptables(四表五链&#xff09; 一、防火墙 1、防火墙的类别 安全产品 杀毒 针对病毒&#xff0c;特征篡改系统中文件杀毒软件针对处理病毒程序 防火墙 针对木马&#xff0c;特征系统窃密 防火墙针对处理木马 防火墙分为两种 硬件…

【Python基础教程】5. 数

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;python基础教程 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、…

芒果YOLOv8改进154:提出多种<独家原创结构>ReNLANLSK, CPNGhost, CSCLSK, C2fLSK等,基于LSKNet,即插即用

本篇文章内容基于 论文 LSKNet 论文 的核心, 针对其核心,芒果专栏提出多种原创结构 芒果专栏提出基于 LSKNet 的多种原创结构,改进源码教程 | 详情如下🥇 👉1. 原创结构:ReNLANLSK、👉2. 原创结构:CPNLSK 👉3. 原创结构:CSCLSK、 👉4. 原创结构:C3LSK、 👉5…

labelme、labelimg的安装及使用(含格式转换)

目录 labelme、labelimg简要介绍 labelme labelimg Anaconda虚拟环境 labelme安装 labelme的使用 labelimg安装 labelimg的使用 json格式转换 标注便携操作 labelme、labelimg简要介绍 labelme和labelimg都是图像标注工具&#xff0c;它们在机器学习和计算机视觉领…

在CentOS 8.5.2111下安装vncserver tigervnc-server

# 参考&#xff1a; How to Install TigerVNC Server on CentOS 8 前提&#xff1a; 默认用root操作所有命令 安装桌面GUI dnf groupinstall "Server with GUI" 安装tigervnc-server dnf install tigervnc-server 增加vncuser用户&#xff08;这里默认就是vncuse…

基础数据结构-链表,栈,队列

链表 常见的链表有单链表和双链表 单链表&#xff1a;每个结点有一个next指针指向下一个结点&#xff0c;data存放数据 双链表&#xff1a;每个结点有一个next指针指向下一个结点&#xff0c;prev指针指向上一个结点&#xff0c;data存放数据。 4的下一结点为-1&#xff0c;…

【GO语言卵细胞级别教程】11.探索Go语言的面向对象编程之美(含源码仅此一份,先到先得)

【GO语言卵细胞级别教程】11.探索Go语言的面向对象编程之美&#xff08;含源码仅此一份&#xff0c;先到先得&#xff09; 目录 【GO语言卵细胞级别教程】11.探索Go语言的面向对象编程之美&#xff08;含源码仅此一份&#xff0c;先到先得&#xff09;1.面向对象的引用1.1简介1…

详解TCP/IP五层模型

目录 一、什么是TCP五层模型&#xff1f; 二、TCP五层模型的详细内容 1. 应用层 2. 传输层 3. 网络层 4. 数据链路层 5. 物理层 三、网络设备所在分层 封装和分⽤ 三、Java示例 引言&#xff1a; 在网络通信中&#xff0c;TCP/IP协议是至关重要的。为了更好地理解TCP协议的工…

02-JDK新特性-try-with-resources自动管理资源关闭

try-with-resources 为什么要介绍这个了 看看一下以下代码&#xff1a; public static void fileCopyByTryWithResources(File src, File des) throws IOException {try (FileInputStream fis new FileInputStream(src); FileOutputStream fos new FileOutputStream(des);…

AI预测福彩3D第26弹【2024年4月4日预测--第4套算法重新开始计算第11次测试】

今天清明节假日&#xff0c;一会要外出&#xff0c;可能要晚点回来。咱们尽早先把预测数据跑完&#xff0c;把结果发出来供各位彩友参考。合并下算法&#xff0c;3D的预测以后将重点测试本套算法&#xff0c;因为本套算法的命中率较高。以后有时间的话会在第二篇文章中发布排列…

微电网优化:基于肝癌算法(Liver Cancer algorithm, LCA)的微电网优化(提供MATLAB代码)

一、微电网优化模型 微电网是一个相对独立的本地化电力单元&#xff0c;用户现场的分布式发电可以支持用电需求。为此&#xff0c;您的微电网将接入、监控、预测和控制您本地的分布式能源系统&#xff0c;同时强化供电系统的弹性&#xff0c;保障您的用电更经济。您可以在连接…

Vue3【进阶】

简介 https://cn.vuejs.org/guide/introduction.html 创建vue3工程 【基于 vue-cli创建】 基本和vue-cli的过程类似&#xff0c;只是选择的时候用vue3创建 【基于vite创建】【推荐】 【官网】https://vitejs.cn/ 【可以先去学一下webpack】 步骤 【https://cn.vitejs.…

【APUE】网络socket编程温度采集智能存储与上报项目技术------多进程编程

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

item_search-按关键字搜索淘宝商品接口:精准关键字,多样搜索类型,智能排序——淘宝购物新体验

淘宝购物新体验&#xff1a;item_search接口——精准关键字、多样搜索类型与智能排序 在淘宝购物的新体验中&#xff0c;item_search接口扮演着至关重要的角色&#xff0c;它为用户提供了精准关键字搜索、多样搜索类型以及智能排序等功能&#xff0c;极大地提升了购物的便捷性…

趣学前端 | 综合一波CSS选择器的用法

背景 最近睡前习惯翻会书&#xff0c;重温了《HTML5与CSS 3权威指南》。这本书&#xff0c;分上下两册&#xff0c;之前读完了上册&#xff0c;下册基本没翻过。为了对得起花过的每一分钱&#xff0c;决定拾起来近期读一读。 CSS 选择器 在CSS3中&#xff0c;提倡使用选择器…

Python爬虫-懂车帝城市销量榜单

前言 本文是该专栏的第23篇,后面会持续分享python爬虫干货知识,记得关注。 最近粉丝留言咨询某汽车平台的汽车销量榜单数据,本文笔者以懂车帝平台为例,采集对应的城市汽车销量榜单数据。 具体的详细思路以及代码实现逻辑,跟着笔者直接往下看正文详细内容。(附带完整代码…