kirin 980 CPU
Jetson Nano
Jetson Xavier NX
Jetson TX2
Xilinx ZCU104
https://blog.csdn.net/M1512415/article/details/116024395
vsCode插件(koroFileHeader),可快速生成注释模板
"fileheader.configObj": { //快速添加文件头部注释和函数注释
"createFileTime": true, // 设置为true则为文件新建时候作为date,否则注释生成时间为date
"autoAdd": true, // 自动生成注释
"annotationStr": {
"head": "/*",
"middle": " * @",
"end": " */",
"use": true // 设置自定义注释可用
},
},
"fileheader.cursorMode": { // 快速注释函数 ctrl+alt+t
"description": "", // 函数描述
"param ": "", // 函数参数
"return": "", // 函数输出
"Author": "爱酱丶", // 作者
"Date": "Do not edit", // 创建时间
"LastEditTime": "Do not edit", // 最后一次修改的时间
"LastEditors": "爱酱丶" // 修改人员
},
"fileheader.customMade": { // 快速注释文件头部 ctrl+alt+i
"Description": "", // 文件描述
"Author": "爱酱丶", // 作者
"Date": "Do not edit", // 创建时间
"LastEditTime": "Do not edit", // 最后一次修改的时间
"LastEditors": "爱酱丶" // 修改人员
}
函數
CTRL+Win+t
文件
CTRL+Win+i
早期Demo
zeusees/hyperlpr
git_demo
一键安装
python -m pip install hyperlpr
支持python3,支持Windows Mac Linux 树莓派等。
720p cpu real-time (st on MBP r15 2.2GHz haswell).
快速上手
#导入包
from hyperlpr import *
#导入OpenCV库
import cv2
#读入图片
image = cv2.imread("demo.jpg")
#识别结果
print(HyperLPR_plate_recognition(image))
传统方法:
CascadeClassifier是opencv下objdetect模块中用来做目标检测的级联分类器的一个类;简而言之是滑动窗口机制+级联分类器的方式;
opencv2和opencv3中提供了完整的cascade分类器的训练和检测方法
cv::CascadeClassifier cascade;模型训练时候的特征featureType:可选HAAR或LBP,默认为HAAR;
info
cv::CascadeClassifier::detectMultiScale(
const cv::Mat& image, // 输入待检测的图像(灰度)
vector<cv::Rect>& objects, // 输出的目标窗口
double scaleFactor = 1.1, // 尺度系数
int minNeighbors = 3, // 需要的邻域数
int flags = 0, // flag (旧风格的cascades)
cv::Size minSize = cv::Size(), // 最小检测窗口
cv::Size maxSize = cv::Size() // 最大检测窗口
);
类似应用:
滑动窗口 + HOG+SVM可进行目标检测
HOG+SVM可进行目标分类
基本步骤
step1. 使用opencv 的 HAAR Cascade 检测车牌大致位置
step2. Extend 检测到的大致位置的矩形区域
step3. 使用类似于MSER的方式的 多级二值化 + RANSAC 拟合车牌的上下边界
step4. 使用CNN Regression回归车牌左右边界
method 1:
step5. 使用基于纹理场的算法进行车牌校正倾斜
step6. 使用CNN滑动窗切割字符
step7. 使用CNN识别字符
method 2:
step 5:CRNN字符识别
由CNN+BiLSTM+CTC构成
方法一:
Train
CRNN_Chinese_Characters_Rec
https://www.cnblogs.com/wjy-lulu/p/11370541.html
支持类型
SEGMENTATION_FREE_METHOD
才支持绿牌,不定长数据
SEGMENTATION_BASED_METHOD
仅仅支持普通车牌识别,定长
可识别和待支持的车牌的类型
单行蓝牌
单行黄牌
新能源车牌
白色警用车牌
使馆/港澳车牌
教练车牌
武警车牌
主要基于最近的Apollo6.0讲述
CyberRT 就是 Apollo 中的一套基础框架,是面向组件(component)的。组件呈现高度的模块化。
https://frank909.blog.csdn.net/article/details/111598755
每个组件包含特定的算法,用于处理数据输入,并输出算法处理的结果。
玩过 ROS 的同学应该对此类东西不陌生,CyberRT 和 ROS 类似,实际上 Apollo 最初也是用的
ROS1,后来因为时延问题得不到满足,所以自行开发了一个类似的,但性能更好。回到组件问题,Perception 也是组件,之前的文章有介绍,它接收传感器的数据,然后输出障碍物的 3D 信息。
在 CyberRT 中,有如何定义、实现、启动组件的机制说明。
组件管理
通常 4 个步骤进行组件开发:
设置组件文件结构 实现组件类 设置配置文件 启动组件
红绿灯感知
Apollo 中的红绿灯 Apollo 默认有 2 个前视摄像头:
25mm 焦距看远处,视距长,但 FOV 小。 6mm 焦距看近处,视距短,但 FOV 大。
两个摄像头都可以检测到红绿灯,它们相互冗余,但是同一时刻只能以一个为主。
识别策略:
在自动驾驶中,因为考虑到车辆行驶速度很快,因此障碍物的识别一般要求实时,也就是 30FPS 以上。
但相对于障碍物,红绿灯的位置信息没有那么重要,重要的是它的语义信息,也就是红绿颜色变化,但这种频率是非常低的,所以对于红绿灯检测而言,我们不需要那么高的频率,也因此不需要针对每一帧图片都做红绿灯处理。
因此,我们可以隔一个固定的时间周期去查询高精度地图中的红绿灯信息,然后选择最近的图片缓存一起送入到红绿灯处理模型当中,其它的图片就可以丢掉了。
https://blog.csdn.net/u012156872/article/details/107728334
车牌检测包括了车牌定位,检测是粗定位,定位的包括旋转的定位;
定位是一个综合体:
1:轮廓
2:颜色
3:字体
针对opencv4,需要添加头文件:
error: ‘CV_CHAIN_APPROX_NONE’ was not declared in this scope
#include
error: ‘CV_WINDOW_AUTOSIZE’ was not declared in this scope
#include
在opencv3中可编译通过,但opencv4中无法编译,报错:
error: CV_COMP_CORREL was not declared in this scope.
是因为opencv4中CV_COMP_CORREL定义在types_c.h文件中,只需包含以下头文件即可。
#include
FreeType库是一个完全免费(开源)的、高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件。在字体图片生成中常常会用到。
pip install freetype-py
何恺明 通过对大量在户外拍摄的自然景物图片进行统计分析得出一个结论:在绝大多数非天空的局部区域里,某一些像素总会(至少一个颜色通道)具有很低的值。换言之,该区域光强度的最小值是个很小的数(趋于0)。
基于上述结论,我们定义暗通道,用公式描述,对于一幅图像J有如下式子:
也就是说以像素点x为中心,分别取三个通道内窗口Ω内的最小值,然后再取三个通道的最小值作为像素点x的暗通道的值,如下图所示:
Jc代表J的某一个颜色通道,而Ω(x)是以x为中心的一块方形区域。我们观察得出,除了天空方位,Jdark的强度总是很低并且趋近于0。如果J是户外的无雾图像,我们把Jdark称为J的暗原色,并且把以上观察得出的经验性规律称为暗原色先验。
要想从物理模型角度对有雾图像进行清晰化处理,就要了解有雾图像的物理成因,那么就要了解雾天的大气散射模型。
大气散射物理模型包含两部分,第一部分称为直接衰减项(Direct Attenuation)也称直接传播,第二部分称为大气光照(Airlight)
用公式表示如下:
I是观测到的有雾图像,J是景物反射光强度(也就是清晰的无雾图像),A是全局大气光照强度,t用来描述光线通过介质透射到成像设备过程中没有被散射的部分,去雾的目标就是从I中复原J。那么也就是要通过I求A和t。
方程右边的第一项J(x)t(x) 叫做直接衰减项,第二项A(1-t(x))则是大气光照。直接衰减项描述的是景物光线在透射媒介中经衰减后的部分,而大气光则是由前方散射引起的,会导致景物颜色的偏移。因为大气层可看成各向同性的,透射率t可表示为:
β为大气的散射系数,该式表明景物光线是随着景物深度d按指数衰减的。
③求解透射率t
在论文[1]中,作者给出了推导过程,这里就不再重复,其最后得到透射率t的公式如下:
Ic为输入的有雾图像,对其除以全局大气光照Ac后在利用暗通道定义公式进行求解暗通道。w(0 这里需要值得注意的是,求得的t是粗透射率图,并不能直接带入大气模型公式求解,所以需要进行细化后再处理。细化过程见⑤,Ac为全局大气光照,其求法见④。 ④求解全局大气光照Ac 论文[1]中作者给出求解全局大气光照的过程如下: 1.首先对输入的有雾图像I求解其暗通道图像Jdark。 2.选择暗通道Jdark内图像总像素点个数(N_imagesize)千分之一(N=N_imagesize/1000)个最亮的像素点,并记录这些像素点(x,y)坐标。 3.再根据这些点的坐标分别在原图像I的三个通道(r,g,b)内找到这些像素点并加和得到(sum_r,sum_g,sum_b). 4.Ac=[Ar,Ag,Ab]. 其中Ar=sum_r/N; Ag=sum_g/N; Ab=sum_b/N. ⑤细化透射率t ⑥求解最后清晰图像 现在,我们得到了A和t,那么带入大气模型公式: 这里,t0参数用来限定透射率t的下限值,其作用也就是在输入图像的浓雾区域保留一定的雾。 https://www.cnblogs.com/changkaizhao/p/3266798.html 其他应用: 建立不依赖能见度仪观测数据的能见度估计算法,即通过视频/图像中的信息获取场景的能见度。通过查阅文献,能见度可以用消光系数求出,而消光系数可以通过区域的透射率和拍摄距离求得。因此,首先通过暗通道理论获取暗通道图像,再通过大气散射物理模型求得图像得透射率,再通过深度图获取目标物与观测点的距离,再用该距离与透射率求出消光系数,再利用公式求出能见度。 https://yuanwenjie.blog.csdn.net/article/details/110116319
clc;
clear all;
close all;
J = imread('4.jpg');
J = double(J);
J = J ./255 ;
figure(1); imshow(J);
%% 求暗通道图像 Jdark = min(min());
Jdark = Idark(J);
figure(2);imshow(Jdark,[]);
%%
% 注意:何凯明使用了soft matting方法对得到的粗透射率Jt进行细化
% 本代码采用梯度导向滤波实现
Jdark = gradient_guidedfilter(Jdark,Jdark, 0.04);
figure(3);imshow(Jdark,[]);
%% 大气物理模型 J = I*t + A*(1-t) 【直接衰减项】+【大气光照】
% 透射率 t与深度的关系 t=exp(-a*depth)
w = 0.95; %雾的保留系数
Jt = 1 - w*Jdark; %求解透射率
%% 求解全局大气光照
% 1.首先对输入的有雾图像I求解其暗通道图像Jdark。
% 2.选择Jdark总像素点个数千分之一(N/1000)个最亮的像素点,记录像素点(x,y)坐标
% 3.根据点的坐标分别在原图像J的三个通道(r,g,b)内找到这些像素点并加和得到(sum_r,sum_g,sum_b).
% 4.Ac=[Ar,Ag,Ab]. 其中Ar=sum_r/N; Ag=sum_g/N; Ab=sum_b/N.
[m,n,~] = size(J);
N = floor( m*n./1000 );
MaxPos = [0,0]; % 初始化
for i=1:1:N
MaxValue = max(max(Jdark));
[x,y] = find(Jdark==MaxValue);
Jdack(Jdark==MaxValue) = 0; %最大值置零,寻找下一次次大值
%检查长度
MaxPos = vertcat(MaxPos,[x,y]);
Cnt = length(MaxPos(1));
if Cnt > N
break;
end
end
MaxPosN = MaxPos(2:N+1,:);
Rsum = 0; Jr = J(:,:,1);
Gsum = 0; Jg = J(:,:,2);
Bsum = 0; Jb = J(:,:,3);
for j=1:1:N
Rsum = Rsum + Jr(MaxPosN(j,1),MaxPosN(j,2));
Gsum = Gsum + Jg(MaxPosN(j,1),MaxPosN(j,2));
Bsum = Bsum + Jb(MaxPosN(j,1),MaxPosN(j,2));
end
Ac = [Rsum/N, Gsum/N, Bsum/N];
6: Panoramic Stitching
#include