![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
opencv
文章平均质量分 52
Mister Zhu
云在青天水在瓶
展开
-
【opencv】YUV各种色彩、YUV420sp2RGB
设实际宽高为w*h的图像,如果是RGB格式,那么他的数据量为w*h*3;如果是yuv420格式,那么他的数据量为w*h*1.5因为yuv4:4:4的数据量等于RGB数据量,而yuv4:4:4是yuv4:2:0数据量的2倍,所以yuv4:2:0的数据量为w*h*3/2。从yuv420sp转化得到rgb的步骤:1.当我们拿到一帧图像的yuv原始数据后,首先需要明确拿到的是以下哪种yuv数据:yuv4:4:4、yuv4:2:2、yuv4:2:0。并且,我们都会知道给对应图像的宽和高,因为这都是驱动配置给原创 2022-02-25 16:23:17 · 5731 阅读 · 1 评论 -
【opencv】丁达尔效应
胶体为什么会有丁达尔现象?在光的传播过程中,光线照射到粒子时,如果粒子大于入射光波长很多倍,则发生光的反射;如果粒子小于入射光波长,则发生光的散射,这时观察到的是光波环绕微粒而向其四周放射的光,称为散射光或乳光。丁达尔效应就是光的散射现象或称乳光现象。由于溶胶粒子大小一般不超过100 nm,小于可见光波长(400 nm~700 nm),因此,当可见光透过溶胶时会产生明显的散射作用。https://wenwen.sogou.com/z/q865580799.htm?fr=wap&_t=53064原创 2021-12-17 21:15:00 · 3558 阅读 · 0 评论 -
【自动驾驶/opencv】32.交通灯颜色提取的难点
交通灯颜色识别有难点,因为很多时候,颜色会因为环境而变化,例如下面的红灯,左边是向左的箭头灯,右边是向右的箭头。但是使用颜色空间进行提取颜色时,这箭头很亮的部分,其实已经接近白色了,所以就提取不到红色了。我们人眼之所以还能觉得它是红色,是因为箭头周边,亮度没那么强的部分还能看出是红色,想把这接近白色的部分提取出红色,自然就不太可能了。上图不用理会右边的交通灯,我因为程序中是限定了id==8641只分析左边这个,所以右边这个没进行提取。...原创 2021-11-25 19:23:55 · 1496 阅读 · 0 评论 -
【opencv】26.图像水平边缘和竖直边缘的算子数学分析
这里我们要细分了,虽然GxG_xGx是对x求偏导得到,但是它反映的是在x方向上的三个像素值差异很大,那么假设黑色图像中一条白色竖线(有10行1列),那么卷积后:在白色竖线以外左边相邻的那一列,他的GxG_xGx值都很大,最大为255(超过255的被赋值为255);在白色竖线的每一点,他的GxG_xGx值都为0;在白色竖线以外右边相邻的那一列,他的GxG_xGx值都为很大负数,会被赋值为0.即,通过计算GxG_xGx,可以知道这三列形成了一条白色竖线。所以GxG_xGx是用来检测竖直边.原创 2021-12-10 21:30:00 · 3002 阅读 · 0 评论 -
【opencv】25.图像卷积cv::filter2D()以及c++代码实例
自己写图像锐化函数:#include <iostream>#include <opencv2/core.hpp>#include <opencv2/highgui.hpp>#include <opencv2/imgproc.hpp>using namespace std;using namespace cv;void Sharpen(const Mat& myImage, Mat& Result);int main(){原创 2021-12-10 21:00:00 · 3523 阅读 · 0 评论 -
【opencv】24.图像cv::Mat浅拷贝=、与深拷贝clone()、copyTo()
cv::Mat img1 = cv::Mat::zeros(cv::Size(100, 100), CV_8UC1); cv::Mat img2 = img1; cv::Mat img3 = img1.clone(); cv::circle(img1, cv::Point(50, 50), 20, cv::Scalar(255, 255, 255), -1); std::string win_name = "img1"; cv::namedWindow(win_name, cv:..原创 2021-12-09 20:03:04 · 3579 阅读 · 0 评论 -
【opencv】23.HOG+SVM使用opencv库函数的C++代码实现
本篇博客的目的是记录一下代码中怎么用opencv实现HOG+SVM,只记录主要步骤至于怎么训练svm模型,不在介绍之内,如果有人想看HOG+SVM详细原理的,可以参考这篇博客。假设输入是任意尺寸的动物图片,(最好保证动物在输入的这张图片中占比80%以上)。先灰度化;把图片resize为同一尺寸;计算该图片的hog描述子;将该图片的hog描述子放进SVM中进行识别,最后输出动物类别索引。#include "opencv2/imgproc.hpp"#include "opencv2/ml.h原创 2021-09-14 17:16:08 · 2498 阅读 · 5 评论 -
【opencv】21.图像处理为什么要归一化
图像处理为什么要归一化和如何归一化答:其中一个原因是,对于网络模型训练等,是为了加速神经网络训练收敛,以及保证程序运行时收敛加快。其他原因见下面参考博客。对图像归一化有2种处理方式:(1) img/255.0(2) img/127.5 - 1第一种图像归一化方式,范围为[0, 1];第二种图像归一化方式,范围为[-1, 1],这两种只是归一化范围不同.参考1:原文链接参考2:原文链接matlab图像处理为什么要归一化和如何归一化?一、为什么归一化1.基本上归一化思想是利用图像的不变转载 2021-07-08 17:57:26 · 10021 阅读 · 5 评论 -
【opencv】22.HOG的原理与详细步骤
一般用到hog做特征描述子的情况就是,这个window只包含目标物体,很少含其他物体。例如经过目标检测提取的行人roi图像,我们用这只包含人的roi图像进行hog特征描述子提取。当然,我们可以直接把这roi部分的图像直接resize为一个行向量,作为SVM的输入,但是这样会有很多干扰,如果进一步提取hog的话,就会有很多边缘细节,能让svm更快收敛,并且模型识别度更好。以下是一个hog_descriptor.xml的举例:<?xml version="1.0"?><opencv_st原创 2021-12-10 16:42:47 · 3689 阅读 · 0 评论 -
【opencv】20.直方图均衡化的数学原理
假设一幅图中的像素范围是 [10~160],有100个像素取值(因为有些像素值可能并没有,例如,一张图中像素值为75的像素一个都没有),直方图均衡化的做法就是:1.计算该灰度图的直方图;2.遍历灰度直方图,把像素值从0~255的每个像素值按照下面公式进行累计求和:f(x)=(L−1)Σh(xi)w∗hf(x)=(L-1)\Sigma {\frac{h(x_i)}{w*h}}f(x)=(L−1)Σw∗hh(xi)其实累计求和就是下面这样,假设灰度图片总共有25500个像素:像原创 2021-12-07 19:33:41 · 1845 阅读 · 0 评论 -
【opencv】19.图像边缘检测算子数学原理、像素一二阶导数的意义
1.像素一二阶导数的意义下面导数是数学中的定义一阶导数:f′(x)=f(x+Δx)−f(x)Δxf'(x)=\frac{f(x+\Delta{x})-f(x)}{\Delta{x}}f′(x)=Δxf(x+Δx)−f(x)或者:f′(x)=f(x)−f(x−Δx)Δxf'(x)=\frac{f(x)-f(x-\Delta{x})}{\Delta{x}}f′(x)=Δxf(x)−f(x−Δx)二阶导数:f′′(x)=f′(x+Δx)−f′(x)Δxf''(x)=\frac{f'(x+\Del原创 2021-12-08 19:10:30 · 1645 阅读 · 0 评论 -
【opencv】18.数字图像一阶导数、二阶导数的数学原理
一阶导数求导过程:二阶导数求导过程:用数学公式表达一阶微分(不同于连续函数的无限趋向于0的 [公式] ,数字领域最小单位为1):摘自:第三章 灰度变换与空间滤波-(六)锐化空间滤波器之基础从上面两个公式可以看出,对图像的某元素求一阶导数,就是用相邻元素减去这个元素。不过上面只展示了一维的x,另一维的y没写出来,就是y不变时,该像素的右边像素的像素值减去该像素的像素值。这是检测横向的。当然也可以检测纵向的,还有斜线的。...转载 2021-09-14 09:53:25 · 5944 阅读 · 1 评论 -
【opencv】17.提取RBG各种颜色c++代码
提取RBG各种颜色c++代码原创 2021-11-25 19:24:11 · 5641 阅读 · 1 评论 -
【opencv】16.截取图像中的一个roi区域时,判断该roi是否越界
在图像处理中,经常会遇到程序运行中断,直接报如下错误:这是选取的roi不合法导致的越界。可以加上上面提示的内容,进行合法性判断:cv::Mat img;cv::Rect roi(x,y,w,h);bool is_rect = (0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= img.cols && 0 <= roi.y && 0 &l原创 2021-11-18 18:36:22 · 1369 阅读 · 1 评论 -
【opencv】15.H265Decoder解码h265为cv::Mat完整代码
https://blog.csdn.net/u011754972/article/details/121281557原创 2021-11-16 18:59:44 · 3065 阅读 · 0 评论 -
【opencv】14.cv::cvtColor函数转换颜色空间时使用CV_RGB2BGR与CV_BGR2RGB结果一样的原因
看下面一段代码:cv::Mat img1 = imread("./lena_bgr.png",1);cv::Mat img2,img3;cv::cvtColor(img1, img2, CV_RGB2BGR);cv::cvtColor(img1, img3, CV_BGR2RGB); cv::imshow("img1", img1);cv::imshow("img2", img2);cv::imshow("img3", img3);cv::waitKey(0);可以看出,img2和im原创 2021-10-11 20:40:59 · 3745 阅读 · 5 评论 -
【opencv】13.摄像头焦距和视场角
摄像头焦距和视场角摄像头焦距和视场角:广角镜头: 视场角FOV越大,焦距越小,则视野越大,物体越小,看的越近,远处的物体看不清;长焦镜头: 视场角FOV越小,焦距越大,则视野越小,物体越大,看的越远,近处的物体看不到;使用视场角命名的摄像头,如28度、60度、100度、182度。 其中28度看的最远。使用焦距命名的摄像头:如6mm、12mm、25mm。 其中25mm摄像头看的最远。...原创 2021-09-08 18:10:38 · 2079 阅读 · 0 评论 -
【opencv】12.RGB和BGR的转化,通道分离与合并
RGB和BGR的转化,通道分离与合并opencv中默认读取的图片格式是BGR,并非RGB.下面是opencv的更直接BGR转RGB方法:cv::cvtColor(bgr_img, rgb_img, cv::COLOR_BGR2RGB);下面是通道的分离与合并:std::vector<cv::Mat> MatVct_1(3);cv::split(src_img, MatVct_1); //这句话把src_img分离为三个Matstd::vector<cv::Mat> M原创 2021-09-08 18:03:37 · 3292 阅读 · 0 评论 -
【opencv】11.旋转、翻转图片
opencv旋转图片C++版本的旋转:cv::Mat img; // 以下二者结合使用就是:顺时针旋转90度cv::transpose(img, img); //对矩阵做转置后,并非旋转了90度。需要再配合翻转才行// 第三个参数是flipcode,flipcode=0,则在X轴上做镜像,// 如果flipcode=1,则在Y轴上做镜像,如果flipcode=-1则在两个轴同时作镜像.cv::flip(img, img, 1); Python版本的图片旋转://重要的是看注原创 2021-09-08 17:58:07 · 740 阅读 · 0 评论 -
【opencv】10.播放视频 以及 设置任意键为暂停键
opencv播放视频 以及 设置任意键为暂停键【该方法不实用,可能会暂停不了,时灵时不灵】对于cv::VideoCapture的使用可以参考 https://blog.csdn.net/guduruyu/article/details/68486063 cv::Mat img; std::string videopath="./path/.."; cv::VideoCapture cap; cap.open(videopath); if (!cap.i原创 2021-09-08 17:55:43 · 922 阅读 · 0 评论 -
【opencv】9.批量命名图片文件std::sprintf
std::sprintf的用法double db=10.123456;char aaa[20];std::sprintf(aaa,"qqq:%.1f",db); //aaa[]就变成了qqq:10.1,保留一位小数cv::putText(img, aaa, cv::Point(100 , 100), cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(255, 255, 0), 2); //在img上显示文字内容std::string str(aaa)原创 2021-09-08 17:53:44 · 233 阅读 · 0 评论 -
【opencv】8.获取鼠标动作(滑轮滚动,左键按下,右键按下,鼠标移动)并进行相应处理
获取鼠标动作进行相应处理int main(){ cv::imshow("EnvFusion", img); //这里显示一个窗口 /*<!-- 在窗口上进行鼠标操作就使用 cv::setMouseCallback()--> <!-- 可进行的操作有 滑轮滚动,左键按下,右键按下,鼠标移动, 还可以组合,比如鼠标左键按下并且鼠标移动,就是鼠标在窗口中拖动 --> <!-- 该函数也会获取鼠标点击的x,y -->*/ cv:原创 2021-09-08 17:51:07 · 722 阅读 · 0 评论 -
【opencv】7. cv::VideoWriter的使用,把图片写进video
cv::VideoWriter的使用,把图片写进video//注意:输出的视频名称中必须有数字,否则会报错,CAP_IMAGES: can't find starting number (in the name of file):....,可以查看源码,这个错误不查看源码根本就找不到问题所在。 cv::VideoWriter video_writer_; int frame_count_; //初始化 if (FLAGS_use_test_mode) { // int codec原创 2021-09-08 17:49:51 · 1865 阅读 · 0 评论 -
【opencv】6.视频编码格式与封装格式
视频编码格式与封装格式,opencv2.4.8不能读取h265编码格式的视频文件(1)编码格式是编码格式,封装格式(也可以说容器)是封装格式。编码格式有H.265、JPEG、MPEG-4 Video等,封装格式有MP4、AVI等。opencv2.4.8不支持读取h.265编码格式,opencv3.4可以读取h.265编码格式的视频。所以还是简单粗暴的这么干吧:ffmpeg -i source_video.mp4 -vcodec mpeg4 final_video.mp4(2)转换MP4到avi如果有原创 2021-09-08 17:48:47 · 2117 阅读 · 0 评论 -
【opencv】5.cv::findContours和cv::drawContours()
原文链接:https://blog.csdn.net/guduruyu/article/details/69220296可以通过查找轮廓,找出图像中的对象。这轮廓是由一系列点组成的,根据查找轮廓时的不同方式,得到的轮廓点的数量也会有所不同。1.cv::findContours解析:函数cv::findContour是从二值图像中来计算轮廓的,它可以使用cv::Canny()函数处理后的图像,因为这样的图像含有边缘像素;也可以使用cv::threshold()或者cv::adaptiveThreshol转载 2021-08-31 17:31:54 · 494 阅读 · 0 评论 -
【opencv】4.初始化Mat的方式、访问cv::Mat中的某个元素
可以直接参考:https://www.cnblogs.com/guoben/p/12728390.html方法1:cv::Mat img_1 = cv::Mat::zeros(cv::Size(input_channel.cols, input_channel.rows), CV_8UC1);方法2:cv::Mat img_2 = cv::Mat::zeros(int rows, int cols, int type);type可以为CV_8UC1,如果涉及到Mat矩阵乘法cv::solve求原创 2021-08-30 15:02:37 · 772 阅读 · 0 评论 -
【opencv】3.在一个opencv窗口中显示多个视频界面、画箭头、画掉头箭头
1.在一个opencv窗口中显示不同视频界面/*** @brief 在一个opencv窗口win_name中显示不同视频界面* @param img_1 和 img_2 是分别是取自不同视频中的一帧 cv::Mat**/void Draw(cv::Mat &img_1, cv::Mat &img_2) { cv::Mat img = cv::Mat(1080, 1920, CV_8UC3, cv::Scalar(0, 0, 0)); //(1080h,1920w)原创 2021-07-02 20:21:16 · 689 阅读 · 0 评论 -
【opencv】2.opencv绘图、视频等
1.opencv在图片中绘图常使用的几个函数opencv中的(0,0)坐标是在图像的左上角。一般会将 cv::getTextSize() 与 cv::putText() 结合使用. cv::getTextSize() //实际绘制文字之前,使用cv::getTextSize()接口先获取待绘制文本框的大小,以方便放置文本框。返回值为cv::Size。设返回值为size,可以通过size.width和size.height来获取文本框的宽和高. cv::putText() //在图像上绘制原创 2021-04-20 13:41:32 · 373 阅读 · 0 评论 -
【opencv】1.opencv安装、编译、运行等踩坑记录
1.安装python2环境下opencv2.4.9安装不成功的解决方法2.查看linux下的各种安装库的安装位置和版本,以opencv为例3.cmake与g++: opencv之在Linux下编译 opencv 程序的两种方式4.安装Python版opencv使用国内镜像下载方法5.python3中无法import cv2,importError1.安装python2环境下opencv2.4.9安装不成功的解决方法由于之前安装过opencv3.xx版本,在安装python2环境下opencv2.原创 2020-05-09 11:53:03 · 698 阅读 · 0 评论 -
【opencv】数字图像处理 精选博客搜集
lowkeyway一个不务正业的程序员原创 2021-09-14 17:20:25 · 130 阅读 · 0 评论