opencv c++小笔记本(三)

news2024/11/23 5:05:49

opencv

  • 一图像通道的分离和合并
  • 二.图像色彩改变
  • 三.简单形状识别
    • 1.灰度处理
    • 2.高斯滤波
    • 3.边缘检测
    • 4.膨胀
  • 三.像素点统计
  • 四.多边形的绘制和填充
  • 五.鼠标操作与响应(截图)
  • 六.图像的像素转换和归一化
  • 七.视频文件摄像头使用
  • 八.视频的处理与保存
  • 九.图像直方图
  • 十.卷积核

一图像通道的分离和合并

在这里插入图片描述

split函数,分离通道。merge函数合并通道,merge有两个版本分别对应vector的和数组的。mixChannels可以直接进行通道混合。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

二.图像色彩改变

在这里插入图片描述
在这里插入图片描述

三.简单形状识别

识别详解1
识别详解2

1.灰度处理

cvtColor(img, imgGray,COLOR_BGR2GRAY, 0);

2.高斯滤波

传送门(高斯滤波)

在这里插入图片描述

3.边缘检测

在这里插入图片描述

4.膨胀

三.像素点统计

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
方差

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

四.多边形的绘制和填充

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

绘制和填充

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

五.鼠标操作与响应(截图)

void setMousecallback(const string& winname, MouseCallback onMouse, void * userdata=0)
winname:窗口的名字
onMouse:鼠标响应函数,回调函数。指定窗口里每次鼠标时间发生的时候,被调用的函数指针。 这个函数的 原型应该为void on_Mouse(int event, int x, int y, int flags, void * param);
userdate:传给回调函数的参数

void on_Mouse(int event, int x, int y, int flags, void * param);
event是 CV_EVENT_ * 变量之一
x和y是鼠标指针在图像坐标系的坐标(不是窗口坐标系)
flags是CV_EVENT_FLAG的组合, param是用户定义的传递到setMouseCallback函数调用的参数。

event
在这里插入图片描述

flag

在这里插入图片描述

在这里插入图片描述

截取任意图形

boundingRect只有一个参数即传vector,vector里是点集(不能有斜度)。minAreaRect可以有斜度。

简易的截图工具(按中键可以转换成三角形)ps:滑到外面会导致系统t终止可以自行修正

//截图
Point sp(-1, -1);
Point ep(-1, -1);
Point dp(-1, -1);

Mat tmp;
int ret;


void on_Mouse(int event, int x, int y, int flags, void* param)
{
	Mat img = *(Mat*)param;
	if (event == EVENT_MBUTTONDOWN)//按住中间
	{
		if (ret == 1) ret = 0;
		else ret = 1;
	}
	if (event == EVENT_LBUTTONDOWN)//按下左键
	{
		sp.x = x;
		sp.y = y;
	}
	else if (event == EVENT_LBUTTONUP)//松开左键
	{
		ep.x = x;
		ep.y = y;
		int dx = abs(ep.x - sp.x);
		int dy = abs(ep.y - sp.y);
		dp.x = sp.x;
		dp.y = y;
		vector<Point>p;
		p.push_back(sp);
		p.push_back(ep);
		p.push_back(dp);
		if (ret == 0)
		{
			Rect box(sp.x, sp.y, dx, dy);
			rectangle(img, box, Scalar(0, 0, 255));
			imshow("ROI区域", img(box));
			imshow("鼠标绘制", img);
		}
		else if (ret == 1)
		{
			Rect ret = boundingRect(p);
			polylines(img,p, 1, Scalar(0, 255, 255));
			imshow("ROI区域", img(ret));
			imshow("鼠标绘制", img);
		}
		sp.x = 0, sp.y = 0;
		ep.x = 0, ep.y = 0;
		dp.x = 0, dp.y = 0;
	}
	else if (event == EVENT_MOUSEMOVE)//移动鼠标
	{
		ep.x = x;
		ep.y = y;
		int dx = abs(ep.x - sp.x);
		int dy = abs(ep.y - sp.y);
		dp.x = sp.x;
		dp.y = y;
		vector<Point>p;
		p.push_back(sp);
		p.push_back(ep);
		p.push_back(dp);
		tmp.copyTo(img);
		if (ret==0&&sp.x > 0 && sp.y > 0)
		{
			rectangle(img, Rect(sp.x, sp.y, dx, dy), Scalar(0, 0, 255));
			imshow("鼠标绘制", img);
		}
		else if (ret == 1&&sp.x>0&&sp.y>0)
		{
			polylines(img, p, 1, Scalar(0, 255, 255));
			imshow("鼠标绘制", img);
		}
	}
}

int main()
{
	Mat img=imread("C:/Users/ASUS/Pictures/Screenshots/建筑物1.png");
	string p("鼠标绘制");
	namedWindow(p);
	setMouseCallback(p,on_Mouse,&img);
	imshow("鼠标绘制", img);
	tmp = img.clone();
	//namedWindow("bin");
	//imshow("bin", bin);
	waitKey();
	return 0;
}

六.图像的像素转换和归一化

在这里插入图片描述

在这里插入图片描述

一个函数convertTO,可以将图片转换成其他类型,这里归一化是将像素点调到0-1之间,所以必须先将图片转换成浮点数存储。

在这里插入图片描述

七.视频文件摄像头使用

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

八.视频的处理与保存

int main()
{
    
    VideoCapture capture("C:/Users/ASUS/Videos/Captures/风景1.mp4");
    if (!capture.isOpened())//判断是否打开成功
    {
        cout << "open fail" << endl;
        return -1;
    }
    //获取视频属性
    int wid = capture.get(CAP_PROP_FRAME_WIDTH);//读取宽
    int hight = capture.get(CAP_PROP_FRAME_HEIGHT);//读取高
    int count = capture.get(CAP_PROP_FRAME_COUNT);//读取总帧数
    double fps = capture.get(CAP_PROP_FPS);//读取一秒多少帧
    cout << wid << "宽" << endl;
    cout << hight << "高" << endl;
    cout << count << "count" << endl;
    cout << fps << "fps" << endl;
    //保存视频
    //1.保存位置  2.保存代码段 3.fps 4.尺寸 5.颜色是否一致 
    //和下面的write搭配使用
    VideoWriter writer("C:/Users/ASUS/Videos/Captures/test.mp4",capture.get(CAP_PROP_FOURCC),fps,Size(wid,hight),true);

    //播放视频
    Mat fram; 
    while (1)
    {
        capture >> fram;//读取视频帧
        if (fram.empty())//判断是否到结尾
            break;
        imshow("fram", fram);

        writer.write(fram);

        int c = waitKey(1);//等待25ms
        if (c == 27) break;
    }
    capture.release();
    writer.release();
    return 0;
}

九.图像直方图

参考博客

在这里插入图片描述

int main()
{
    Mat img = imread("C:/Users/ASUS/Pictures/Screenshots/建筑物1.png");
    //三通道分离
    vector<Mat> bgr_plane; 
    split(img, bgr_plane);
    //定义参数变量
    const int channels[1] = { 0 };
    const int bins[1] = { 256 }; 
    float hranges[2] = { 0,255 };
    const float* ranges[1] = { hranges };
    Mat b_hist;
    Mat g_hist;
    Mat r_hist;
    //计算Blue, Green, Redi通道的直方图
    calcHist(&bgr_plane[0],1,0,Mat(),b_hist,1,bins,ranges);
    calcHist(&bgr_plane[1],1,0,Mat(),g_hist,1,bins,ranges); 
    calcHist(&bgr_plane[2],1,0,Mat(),r_hist,1,bins,ranges);
    //显示直方图
    int hist_w = 512; 
    int hist_h = 400;
    int bin_w = cvRound((double)hist_w / bins[0]);
    Mat histImage = Mat:: zeros(hist_h, hist_w, CV_8UC3);
    //归一化直方图数据
    normalize(b_hist,b_hist,0,histImage.rows,NORM_MINMAX,- 1,Mat());
    normalize(g_hist,g_hist,0,histImage.rows,NORM_MINMAX,- 1,Mat());
    normalize(r_hist,r_hist,0,histImage.rows,NORM_MINMAX,- 1,Mat());
    //绘制直方图曲线
    for (int i = 1; i < bins[0]; i++)
    {
        line(histImage, Point(bin_w * (i - 1), hist_h - cvRound(b_hist.at<float>(i - 1))),
            Point(bin_w * (i), hist_h - cvRound(b_hist.at<float>(i))), Scalar(255, 0, 0), 2, 8, 0);
        line(histImage, Point(bin_w * (i - 1), hist_h - cvRound(g_hist.at<float>(i - 1))),
            Point(bin_w * (i), hist_h - cvRound(g_hist.at<float>(i))), Scalar(0, 255, 0), 2, 8, 0);
        line(histImage, Point(bin_w * (i - 1), hist_h - cvRound(r_hist.at<float>(i - 1))), 
            Point(bin_w * (i), hist_h - cvRound(r_hist.at<float>(i))), Scalar(0, 0, 255), 2, 8, 0);
        // 显示直方图
    }
    namedWindow("Histogram Demo", WINDOW_AUTOSIZE);
    imshow("Histogram Demo", histImage);
    waitKey();
    return 0;
}

十.卷积核

下面的卷积核就是求出3*3方格里的均值再放入中心点,依次往后移动。这样只有最外层的格子不能被处理,对于最外层一般有丢弃和填充两种方法。这种均值操作会导致图像的信息丢失,更加模糊。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

ESP32-C2开发板 Homekit程序示例

准备 1.1硬件ESP32 C2开发板&#xff0c;如图1-1所示 图1-1 ESP32 C2开发板 1.2软件 CozyLife APP可以在各大应用市场搜索下载&#xff0c;也可以扫描二维码下载如图1-2所示 HomeKit flash download tool 烧录工具 esp32c2 homkit演示固件 烧录教程 打开flash_download_to…

实用工具篇(一):JApiDocs

JApiDocs是一个无需额外注解、开箱即用的SpringBoot接口文档生成工具。 编写和维护API文档这个事情&#xff0c;对于后端程序员来说&#xff0c;是一件恼人但又不得不做的事情&#xff0c;我们都不喜欢写文档&#xff0c;但除非项目前后端代码都是自己写的&#xff0c;否则API…

redis哨兵模式原理

概述 为了实现redis集群的高可用&#xff0c;redis经历了好几次迭代&#xff0c;从最开始的主从模式&#xff0c;到哨兵模式&#xff0c;再到现在的集群模式&#xff0c;可以说架构的优化越来越好&#xff0c;那本篇文章就介绍一下redis的哨兵模式&#xff0c;不过我司其实使用…

阿里云服务器部署flask简单方法

记录如何在阿里云服务器上部署flask接口并实现公网访问。 文章目录 1. 简介2. 部署python3环境3. 生成requirement.txt4. 将项目打包上传5. 安装依赖库6. 查看防火墙7. 测试能否公网访问 1. 简介 因落地通话callback服务测试&#xff0c;需要我写一个测试demo&#xff0c;用于…

Unity Shader中使用GLSL创建材质

目录 Unity Shader格式Properties怎么在脚本中使用类似于glUniform()的功能呢&#xff1f; SubShaderTagsLODpasspass内的tags说明pass内的代码段&#xff08;GLSL&#xff09;GLSL与CG语言的差异1. GLSL不可在外部定义结构体2. 在UnityShader中Uniform可以写在vert frag外面 S…

如何处理图片排重(精准排重,相似排重)

图片相似度对比 1、需求 假如有一个图片池&#xff0c;存有1亿图片。给一张目标图片&#xff0c;在图片池中做匹配。 判断一张图片是否在图片池中出现过。&#xff08;完全一样&#xff09;判断有没有相似的出现过。比如两张图相似度90&#xff0c;两张图片是在描述一件事情。 …

请推荐几个github上的vue的pc端项目?

前言 这是github上一些高收藏的vue PC端的项目&#xff0c;花了一点时间做了一下vue2和vue3的资源分类整理&#xff0c;可以根据自己的学习进度以及需求来选择对应的项目来研究&#xff0c;希望对你有帮助~ Vue2 PC项目 1、 Elemen Star&#xff1a;53.4k 是一个基于Vue.js…

【Unity Optimize】使用图集(Sprite Atlas)优化项目

目录 1 图集&#xff08;Sprite Atlas&#xff09;介绍2 创建与配置Sprite Atlas2.1 创建Sprite Atlas2.1.1 Unity2D项目2.1.2 Unity3D项目 2.2 配置Sprite Atlas2.3 注意事项 3 Sprite Atlas的接口4 Sprite Atlas的优化建议 1 图集&#xff08;Sprite Atlas&#xff09;介绍 …

vue3+element plus+vite 引入本地静态资源图片require报错的原因和解决方案,以及如何在表格中展示图片

文章目录 一、vue3element plusvite 引入本地静态资源图片require报错的原因和解决方案二、vue 3element plusvite 项目中&#xff0c;在el-table中展示本地静态图片总结 一、vue3element plusvite 引入本地静态资源图片require报错的原因和解决方案 在写vue3vite项目的过程中…

Java-代码连接数据库生成POJO、Mapper

本文主要介绍如何在IDEA中&#xff0c;编写代码连接数据库生成对应的POJO、Mapper、Service、Controller 文章目录 前言环境搭建代码开发基本配置常量信息代码生成 测试结果 前言 在实际开发中&#xff0c;设计完数据库后&#xff0c;不可避免需要创建数据库表对应的POJO&…

rt-thread汇总

finish和msh的区别&#xff1f; 这个问题我一直没搞懂&#xff0c;可能得看一下源码才能搞清楚了吧 通过Qemu运行RT-Thread 在windows上通过QEMU快速上手RT-thread smart RT-thread启动流程 rt-thread启动流程 Kconfig语法 Kconfig语法 LOG输出 rt_kprintf("Hello …

InsCode AI ,你的良师益友!

Chat-GTP的火爆程度相信大家已经听说了&#xff0c;也对它有一个基本的初识&#xff0c;它是Open AI所研发的&#xff0c;读者当中应该有不少人已经接触和体验人工智能聊天&#xff0c;以及使用它交流很多问题有关于生活&#xff0c;学习等&#xff0c;而 InsCode AI 也一样能够…

javaWeb ssh学堂在线管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh学堂在线管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0…

30天从入门到精通TensorFlow1.x 第三天,tf.variable_scope()共享或重用变量

tf.variable_scope()共享或重用变量 文章目录 一、接前一天二、tf.variable_scope()共享或重用变量1. 背景2. 目的3. tf.variable_scope()基本参数3. tf.variable_scope()作用&#xff08;1&#xff09;.命名空间&#xff08;2&#xff09;.共享变量&#xff08;3&#xff09;.…

软考A计划-电子商务设计师-电子商务相关技术与应用基础知识

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

cesium 相机相关

1 相机的初始位置 /*** The default rectangle the camera will view on creation.* type Rectangle*/ Camera.DEFAULT_VIEW_RECTANGLE Rectangle.fromDegrees(-95.0,-20.0,-70.0,90.0 );// set default view rectangleCameraPosition3D(this,Camera.DEFAULT_VIEW_RECTANGLE,…

Async 使用详解

Spring Boot异步调用Async 在实际开发中&#xff0c;有时候为了及时处理请求和进行响应&#xff0c;我们可能会多任务同时执行&#xff0c;或者先处理主任务&#xff0c;也就是异步调用&#xff0c;异步调用的实现有很多&#xff0c;例如多线程、定时任务、消息队列等&#xf…

若依框架快速搭建(二)

目录 数据库设计功能模块设计XXX信息管理xxx查询xxx添加xxx删除xxx修改xxx导出 功能模块实现运行数据库自动代码生成在IDEA中找到RuoYi-generator&#xff0c;修改配置运行前后端项目&#xff0c;在网页中找到代码生成模块导入表后点击确定&#xff0c;序号前打勾&#xff0c;再…

Mac - 光标特效 By CursorEffect2

目录 一.引言 二.安装 CursorEffect2 三.使用 CursorEffect2 四.使用效果 五.内存消耗 六.一键关闭 七.总结 一.引言 在自己搭建的 Hexo 博客上可以定义鼠标点击的特效&#xff0c;如图点击后可以产生彩色的斑点。 于是想着除了浏览 Hexo 博客外&#xff0c;能不能别的也…

【笔试强训编程题】Day1.(组队竞赛100449)和(删除公共字符69390)

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训编程题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;! 文章目录…