关于RANSAC算法的基本思想,可从网上搜索找到,这里只是RANSAC用于SIFT特征匹配筛选时的一些说明。
RANSAC算法在SIFT特征筛选中的主要流程是:
(1) 从样本集中随机抽选一个RANSAC样本,即4个匹配点对
(2) 根据这4个匹配点对计算变换矩阵M
(3) 根据样本集,变换矩阵M,和误差度量函数计算满足当前变换矩阵的一致集consensus,并返回一致集中元素个数
(4) 根据当前一致集中元素个数判断是否最优(最大)一致集,若是则更新当前最优一致集
(5) 更新当前错误概率p,若p大于允许的最小错误概率则重复(1)至(4)继续迭代,直到当前错误概率p小于最小错误概率
下面结合RobHess的源码说明一下RANSAC算法在SIFT特征匹配筛选中的实现,
具体的源码分析见此系列文章:RobHess的SIFT源码分析:综述
在RobHess的源码中,RANSAC算法的声明和实现在xform.h和xform.c文件中
实现RANSAC算法的主函数是ransac_xform,如下:
CvMat* ransac_xform( struct feature* features, int n, int mtype,
ransac_xform_fn xform_fn, int m, double p_badxform,
ransac_err_fn err_fn, double err_tol,
struct feature*** inliers, int* n_in )
函数说明:利用RANSAC算法进行特征点筛选,计算出最佳匹配的变换矩阵 参数: features:特征点数组,只有当mtype类型的匹配点存在时才被用来进行单应性计算 n:特征点个数 mtype:决定使用每个特征点的哪个匹配域进行变换矩阵的计算,应该是FEATURE_MDL_MATCH, FEATURE_BCK_MATCH,FEATURE_MDL_MATCH中的一个。若是FEATURE_MDL_MATCH, 对应的匹配点对坐标是每个特征点的img_pt域和其匹配点的mdl_pt域, 否则,对应的匹配点对是每个特征点的img_pt域和其匹配点的img_pt域。 xform_fn:函数指针,指向根据输入的点对进行变换矩阵计算的函数,一般传入lsq_homog()函数 m:在函数xform_fn中计算变换矩阵需要的最小特征点对个数 p_badxform:允许的错误概率,即允许RANSAC算法计算出的变换矩阵错误的概率,当前计算出的模型的错误概率小于p_badxform时迭代停止 err_fn:函数指针,对于给定的变换矩阵,计算推定的匹配点对之间的变换误差,一般传入homog_xfer_err()函数 err_tol:容错度,对于给定的变换矩阵,在此范围内的点对被认为是内点 inliers:输出参数,指针数组,指向计算出的最终的内点集合,若为空,表示没计算出符合要求的一致集 此数组的内存将在本函数中被分配,使用完后必须在调用出释放:free(*inliers) n_in:输出参数,最终计算出的内点的数目 返回值:RANSAC算法计算出的变换矩阵,若为空,表示出错或无法计算出可接受矩阵
注释如下:
CvMat* ransac_xform( struct feature* features, int n, int mtype,
ransac_xform_fn xform_fn, int m, double p_badxform,
ransac_err_fn err_fn, double err_tol,
struct feature*** inliers, int* n_in )
{
//matched:所有具有mtype类型匹配点的特征点的数组,也就是样本集
//sample:单个样本,即4个特征点的数组
//consensus:当前一致集;
//consensus_max:当前最大一致集(即当前的最好结果的一致集)
struct feature** matched, ** sample, ** consensus, ** consensus_max = NULL;
struct ransac_data* rdata;//每个特征点的feature_data域的ransac数据指针
CvPoint2D64f* pts, * mpts;//每个样本对应的两个坐标数组:特征点坐标数组pts和匹配点坐标数组mpts
CvMat* M = NULL;//当前变换矩阵
//p:当前计算出的模型的错误概率,当p小于p_badxform时迭代停止
//in_frac:内点数目占样本总数目的百分比
double p, in_frac = RANSAC_INLIER_FRAC_EST;
//nm:输入的特征点数组中具有mtype类型匹配点的特征点个数
//in:当前一致集中元素个数
//in_min:一致集中元素个数允许的最小值,保证RANSAC最终计算出的转换矩阵错误的概率小于p_badxform所需的最小内点数目
//in_max:当前最优一致集(最大一致集)中元素的个数
//k:迭代次数,与计算当前模型的错误概率有关
int i, nm, in, in_min, in_max = 0, k = 0;
//找到特征点数组features中所有具有mtype类型匹配点的特征点,放到matched数组(样本集)中,返回值nm是matched数组的元素个数
nm = get_matched_features( features, n, mtype, &matched );
//若找到的具有匹配点的特征点个数小于计算变换矩阵需要的最小特征点对个数,出错
if( nm < m )
{ //出错处理,特征点对个数不足
fprintf( stderr, "Warning: not enough matches to compute xform, %s" \
" line %d\n", __FILE__, __LINE__ );
goto end;
}
/* initialize random number generator */
srand( time(NULL) );//初始化随机数生成器
//计算保证RANSAC最终计算出的转换矩阵错误的概率小于p_badxform所需的最小内点数目
in_min = calc_min_inliers( nm, m, RANSAC_PROB_BAD_SUPP, p_badxform );
//当前计算出的模型的错误概率,内点所占比例in_frac越大,错误概率越小;迭代次数k越大,错误概率越小
p = pow( 1.0 - pow( in_frac, m ), k );
i = 0;
//当前错误概率大于输入的允许错误概率p_badxform,继续迭代
while( p > p_badxform )
{
//从样本集matched中随机抽选一个RANSAC样本(即一个4个特征点的数组),放到样本变量sample中
sample = draw_ransac_sample( matched, nm, m );
//从样本中获取特征点和其对应匹配点的二维坐标,分别放到输出参数pts和mpts中
extract_corresp_pts( sample, m, mtype, &pts, &mpts );
//调用参数中传入的函数xform_fn,计算将m个点的数组pts变换为mpts的矩阵,返回变换矩阵给M
M = xform_fn( pts, mpts, m );//一般传入lsq_homog()函数
if( ! M )//出错判断
goto iteration_end;
//给定特征点集,变换矩阵,误差函数,计算出当前一致集consensus,返回一致集中元素个数给in
in = find_consensus( matched, nm, mtype, M, err_fn, err_tol, &consensus);
//若当前一致集大于历史最优一致集,即当前一致集为最优,则更新最优一致集consensus_max
if( in > in_max )
{
if( consensus_max )//若之前有最优值,释放其空间
free( consensus_max );
consensus_max = consensus;//更新最优一致集
in_max = in;//更新最优一致集中元素个数
in_frac = (double)in_max / nm;//最优一致集中元素个数占样本总个数的百分比
}
else//若当前一致集小于历史最优一致集,释放当前一致集
free( consensus );
cvReleaseMat( &M );
iteration_end:
release_mem( pts, mpts, sample );
p = pow( 1.0 - pow( in_frac, m ), ++k );
}
//根据最优一致集计算最终的变换矩阵
/* calculate final transform based on best consensus set */
//若最优一致集中元素个数大于最低标准,即符合要求
if( in_max >= in_min )
{
//从最优一致集中获取特征点和其对应匹配点的二维坐标,分别放到输出参数pts和mpts中
extract_corresp_pts( consensus_max, in_max, mtype, &pts, &mpts );
//调用参数中传入的函数xform_fn,计算将in_max个点的数组pts变换为mpts的矩阵,返回变换矩阵给M
M = xform_fn( pts, mpts, in_max );
/***********下面会再进行一次迭代**********/
//根据变换矩阵M从样本集matched中计算出一致集consensus,返回一致集中元素个数给in
in = find_consensus( matched, nm, mtype, M, err_fn, err_tol, &consensus);
cvReleaseMat( &M );
release_mem( pts, mpts, consensus_max );
//从一致集中获取特征点和其对应匹配点的二维坐标,分别放到输出参数pts和mpts中
extract_corresp_pts( consensus, in, mtype, &pts, &mpts );
//调用参数中传入的函数xform_fn,计算将in个点的数组pts变换为mpts的矩阵,返回变换矩阵给M
M = xform_fn( pts, mpts, in );
if( inliers )
{
*inliers = consensus;//将最优一致集赋值给输出参数:inliers,即内点集合
consensus = NULL;
}
if( n_in )
*n_in = in;//将最优一致集中元素个数赋值给输出参数:n_in,即内点个数
release_mem( pts, mpts, consensus );
}
else if( consensus_max )
{ //没有计算出符合要求的一致集
if( inliers )
*inliers = NULL;
if( n_in )
*n_in = 0;
free( consensus_max );
}
//RANSAC算法结束:恢复特征点中被更改的数据域feature_data,并返回变换矩阵M
end:
for( i = 0; i < nm; i++ )
{
//利用宏feat_ransac_data来提取matched[i]中的feature_data成员并转换为ransac_data格式的指针
rdata = feat_ransac_data( matched[i] );
//恢复feature_data成员的以前的值
matched[i]->feature_data = rdata->orig_feat_data;
free( rdata );//释放内存
}
free( matched );
return M;//返回求出的变换矩阵M
}
实验测试:
//特征提取和匹配
void match(IplImage *img1,IplImage *img2)
{
IplImage *img1_Feat = cvCloneImage(img1);//复制图1,深拷贝,用来画特征点
IplImage *img2_Feat = cvCloneImage(img2);//复制图2,深拷贝,用来画特征点
struct feature *feat1, *feat2;//feat1:图1的特征点数组,feat2:图2的特征点数组
int n1, n2;//n1:图1中的特征点个数,n2:图2中的特征点个数
struct feature *feat;//每个特征点
struct kd_node *kd_root;//k-d树的树根
struct feature **nbrs;//当前特征点的最近邻点数组
int matchNum;//经距离比值法筛选后的匹配点对的个数
struct feature **inliers;//精RANSAC筛选后的内点数组
int n_inliers;//经RANSAC算法筛选后的内点个数,即feat1中具有符合要求的特征点的个数
//默认提取的是LOWE格式的SIFT特征点
//提取并显示第1幅图片上的特征点
n1 = sift_features( img1, &feat1 );//检测图1中的SIFT特征点,n1是图1的特征点个数
export_features("feature1.txt",feat1,n1);//将特征向量数据写入到文件
draw_features( img1_Feat, feat1, n1 );//画出特征点
cvShowImage("img1_Feat",img1_Feat);//显示
//提取并显示第2幅图片上的特征点
n2 = sift_features( img2, &feat2 );//检测图2中的SIFT特征点,n2是图2的特征点个数
export_features("feature2.txt",feat2,n2);//将特征向量数据写入到文件
draw_features( img2_Feat, feat2, n2 );//画出特征点
cvShowImage("img2_Feat",img2_Feat);//显示
Point pt1,pt2;//连线的两个端点
double d0,d1;//feat1中每个特征点到最近邻和次近邻的距离
matchNum = 0;//经距离比值法筛选后的匹配点对的个数
//将2幅图片合成1幅图片,上下排列
stacked = stack_imgs( img1, img2 );//合成图像,显示经距离比值法筛选后的匹配结果
stacked_ransac = stack_imgs( img1, img2 );//合成图像,显示经RANSAC算法筛选后的匹配结果
//根据图2的特征点集feat2建立k-d树,返回k-d树根给kd_root
kd_root = kdtree_build( feat2, n2 );
//遍历特征点集feat1,针对feat1中每个特征点feat,选取符合距离比值条件的匹配点,放到feat的fwd_match域中
for(int i = 0; i < n1; i++ )
{
feat = feat1+i;//第i个特征点的指针
//在kd_root中搜索目标点feat的2个最近邻点,存放在nbrs中,返回实际找到的近邻点个数
int k = kdtree_bbf_knn( kd_root, feat, 2, &nbrs, KDTREE_BBF_MAX_NN_CHKS );
if( k == 2 )
{
d0 = descr_dist_sq( feat, nbrs[0] );//feat与最近邻点的距离的平方
d1 = descr_dist_sq( feat, nbrs[1] );//feat与次近邻点的距离的平方
//若d0和d1的比值小于阈值NN_SQ_DIST_RATIO_THR,则接受此匹配,否则剔除
if( d0 < d1 * NN_SQ_DIST_RATIO_THR )
{ //将目标点feat和最近邻点作为匹配点对
pt1 = Point( cvRound( feat->x ), cvRound( feat->y ) );//图1中点的坐标
pt2 = Point( cvRound( nbrs[0]->x ), cvRound( nbrs[0]->y ) );//图2中点的坐标(feat的最近邻点)
pt2.y += img1->height;//由于两幅图是上下排列的,pt2的纵坐标加上图1的高度,作为连线的终点
cvLine( stacked, pt1, pt2, CV_RGB(255,0,255), 1, 8, 0 );//画出连线
matchNum++;//统计匹配点对的个数
feat1[i].fwd_match = nbrs[0];//使点feat的fwd_match域指向其对应的匹配点
}
}
free( nbrs );//释放近邻数组
}
qDebug()<x), cvRound(feat->y));//图1中点的坐标
pt2 = Point(cvRound(feat->fwd_match->x), cvRound(feat->fwd_match->y));//图2中点的坐标(feat的匹配点)
qDebug()<<"("<("<height;//由于两幅图是上下排列的,pt2的纵坐标加上图1的高度,作为连线的终点
cvLine(stacked_ransac,pt1,pt2,CV_RGB(255,0,255),1,8,0);//画出连线
}
cvNamedWindow(IMG_MATCH2);//创建窗口
cvShowImage(IMG_MATCH2,stacked_ransac);//显示
}
结果:
RANSAC筛选前
RANSAC筛选后
RANSAC筛选前 RANSAC筛选后
RANSAC筛选前
RANSAC筛选后
RANSAC筛选前 RANSAC筛选后
RANSAC筛选前
RANSAC筛选后
RANSAC筛选前
RANSAC筛选后
RANSAC筛选前 RANSAC筛选后
RANSAC筛选前 RANSAC筛选后
RANSAC筛选前 RANSAC筛选后
RANSAC筛选前
RANSAC筛选后
RANSAC筛选前
RANSAC筛选后
RANSAC筛选前
RANSAC筛选后
参考
利用RANSAC算法筛选SIFT特征匹配
你可能感兴趣的:(OpenCV,计算机视觉)
二、OpenCV的第一个程序
文章目录一、第一个程序:显示图片1.1cv::imread1.2cv::namedWindow1.3cv::imshow二、第二个程序:视频2.1cv::VideoCapture三、加入了滑动条的基本浏览窗口一、第一个程序:显示图片示例:一个简单的加载并显示图像的OpenCV程序#include#include"./opencv2/opencv.hpp"intmain(){cv::Matimage
《卷积神经网络到Vision Transformer:计算机视觉的十年架构革命》
HeartException
人工智能 学习
前言前些天发现了一个巨牛的人工智能免费学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站题目《卷积神经网络到VisionTransformer:计算机视觉的十年架构革命》展开深度解析,全文采用技术演进史+架构对比+产业影响的三段式结构,附关键数据与趋势预测:卷积神经网络到VisionTransformer:计算机视觉的十年架构革命副标题:从局部感知到全局建模,一场改变AI视觉基石的
目标检测:从基础原理到前沿技术全面解析
随机森林404
计算机视觉 目标检测 人工智能 计算机视觉
引言在计算机视觉领域,目标检测是一项核心且极具挑战性的任务,它不仅要识别图像中有什么物体,还要确定这些物体在图像中的具体位置。随着人工智能技术的快速发展,目标检测已成为智能监控、自动驾驶、医疗影像分析等众多应用的基础技术。本文将全面介绍目标检测的基础概念、发展历程、关键技术、实践应用以及未来趋势,为读者提供系统性的知识框架。第一章目标检测概述1.1目标检测的定义与重要性目标检测(ObjectDet
Ubuntu20.04切换源
dongdundun
ubuntu linux 运维
一、ubuntu20.04系统重装二、工具安装1.更换Ubuntu源更换conda源更换pip源2.安装QQqq闪退卸载安装wine版QQ3.安装搜狗输入法及中文设置安装搜狗输入法中文设置4.安装vim5.安装google6.安装VsCode7.安装python3的opencv8.安装向日葵向日葵闪退9.ubuntu下识别不到U盘10.安装Typora11.安装百度网盘12.安装ceres库(优化
【LangChain编程:从入门到实践】LangChain与其他框架的比较
AI天才研究院
Agentic AI 实战 计算 AI人工智能与大数据 计算科学 神经计算 深度学习 神经网络 大数据 人工智能 大型语言模型 AI AGI LLM Java Python 架构设计 Agent RPA
【LangChain编程:从入门到实践】LangChain与其他框架的比较1.背景介绍1.1人工智能发展现状在当今时代,人工智能(AI)已经成为科技领域中最热门和最具革命性的话题之一。随着计算能力的不断提升和算法的持续优化,AI系统正在不断扩展其应用范围,包括自然语言处理、计算机视觉、决策系统等各个领域。1.2LangChain概述在这种背景下,LangChain作为一个新兴的AI框架应运而生。L
使用 C++/OpenCV 和 MFCC 构建双重认证智能门禁系统
使用C++/OpenCV和MFCC构建双重认证智能门禁系统引言随着物联网和人工智能技术的发展,智能门禁系统在安防领域的应用越来越广泛。相比于传统的钥匙、门禁卡或密码,生物识别技术(如人脸识别、指纹识别、虹膜识别等)提供了更高的安全性与便利性。然而,单一的生物识别方式在某些场景下可能存在安全隐患。例如,人脸识别可能被高清照片或视频欺骗(称为“欺骗攻击”),在光照、姿态变化剧烈时识别率也可能下降。为了
PHP接单涨薪系列(九)之计算机视觉实战:PHP+Stable Diffusion接单指南(2025高溢价秘籍)
攻城狮凌霄
PHP PHP接单涨薪 AI php 计算机视觉 stable diffusion
案例场景某电商公司使用本方案后,产品图制作成本降低90%,广告转化率提升35%,单月节省设计费用超¥80,000。本文将彻底解密如何用PHP+AI视觉技术接取高单价设计外包,让你在竞争激烈的市场中脱颖而出!一、视觉设计市场的AI革命1.1传统设计vsAI设计设计任务传统流程AI流程需求沟通初稿设计反复修改最终交付AI生成微调即时交付2025年设计市场数据对比:指标传统设计AI设计提升幅度单图制作时
纹理贴图算法研究论文综述
点云SLAM
算法 图形图像处理 算法 纹理贴图 计算机图形学 计算机视觉 人工智能 虚拟现实(VR) 纹理贴图算法综述
纹理贴图(TextureMapping)是计算机图形学和计算机视觉中的核心技术,广泛应用于三维重建、游戏渲染、虚拟现实(VR)、增强现实(AR)等领域。对其算法的研究涵盖了纹理生成、映射、缝合、优化等多个方面。1.引言纹理贴图是指将二维图像纹理映射到三维几何表面上,以增强模型的视觉真实感。传统方法主要关注静态几何模型上的纹理生成与映射,而近年来,随着多视角图像重建、RGB-D扫描、神经渲染的发展,
ConvNeXT:面向 2020 年代的卷积神经网络
摘要视觉识别的“咆哮二十年代”始于VisionTransformer(ViT)的引入,ViT很快取代了ConvNet,成为图像分类任务中的最新最强模型。然而,vanillaViT在应用于目标检测、语义分割等通用计算机视觉任务时面临困难。HierarchicalTransformer(如SwinTransformer)重新引入了若干ConvNet的先验知识,使Transformer成为实用的通用视觉
OpenCV中DPM(Deformable Part Model)目标检测类cv::dpm::DPMDetector
村北头的码农
OpenCV opencv 目标检测 人工智能
操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述OpenCV中用于基于可变形部件模型(DPM)的目标检测器,主要用于行人、人脸等目标的检测。它是一种传统的基于特征的目标检测方法,不依赖深度学习,而是使用HOG特征+部件模型来进行检测。示例代码#include#include#includeusingnamesp
深度学习前置知识全面解析:从机器学习到深度学习的进阶之路
一、引言:人工智能时代的核心技术在当今这个数据爆炸的时代,人工智能(AI)已经成为推动社会进步的核心技术之一。作为AI领域最重要的分支,深度学习(DeepLearning)在计算机视觉、自然语言处理、语音识别等领域取得了突破性进展,彻底改变了我们与机器交互的方式。本教案将从机器学习的基础知识出发,系统性地介绍深度学习的核心概念、数学基础、网络架构和训练方法,为读者构建完整的知识体系框架。无论你是刚
PyTorch实战:从零构建CNN模型,轻松搞定MNIST手写数字识别
PyTorch实战:从零构建CNN模型,轻松搞定MNIST手写数字识别大家好!欢迎来到我的深度学习博客!对于每个踏入计算机视觉领域的人来说,MNIST手写数字识别就像是编程世界的“Hello,World!”。它足够简单,能够让我们快速上手;也足够完整,可以帮我们走通一个深度学习项目的全流程。之前我们可能用Keras体验过“搭积木”式的快乐,今天,我们将换一个同样强大且灵活的框架——PyTorch,
计算机视觉中的Transformer:ViT模型详解与代码实现
AI大模型应用工坊
计算机视觉 transformer 人工智能 ai
计算机视觉中的Transformer:ViT模型详解与代码实现关键词:计算机视觉、Transformer、ViT、自注意力机制、图像分块摘要:传统卷积神经网络(CNN)统治计算机视觉领域多年,但2020年一篇《AnImageisWorth16x16Words:TransformersforImageRecognitionatScale》的论文打破了这一格局——它将NLP领域的Transformer
《YOLO11的ONNX推理部署:多语言多架构实践指南》
空云风语
YOLO 人工智能 深度学习 目标跟踪 人工智能 计算机视觉 YOLO
引言:YOLO11与ONNX的相遇在计算机视觉的广袤星空中,目标检测始终是一颗耀眼的明星,其在自动驾驶、智能安防、工业检测、医疗影像分析等诸多领域都有着举足轻重的应用。想象一下,自动驾驶汽车需要实时准确地检测出道路上的车辆、行人、交通标志;智能安防系统要快速识别出监控画面中的异常行为和可疑人员;工业生产线上,需要精准检测产品的缺陷;医疗影像分析中,辅助医生检测病变区域。这些场景都对目标检测技术的准
【CVPR2024】计算机视觉|即插即用|DFAM:marine!不懂DFAM,别说你会做水下动物分割!
论文地址:http://arxiv.org/pdf/2404.04996v1代码地址:https://github.com/Drchip61/Dual_SAM关注UPCV缝合怪,分享最计算机视觉新即插即用模块,并提供配套的论文资料与代码。https://space.bilibili.com/473764881摘要本研究提出了一种新颖的特征学习框架,名为**Dual-SAM,用于高性能的海洋动物分割
Python与Dlib库实现人脸技术实战
西域情歌
本文还有配套的精品资源,点击获取简介:本项目详细说明了如何使用Python结合Dlib库实现人脸检测、识别、数量检测和距离检测。利用Dlib提供的机器学习算法和计算机视觉功能,包括HOG特征检测、级联分类器、面部特征向量模型和关键点预测等,项目能够快速准确地在图像中检测和识别人脸。此外,还介绍了如何统计图像中的人脸数量以及如何计算人脸之间的距离。通过实际代码资源,开发者能够掌握实时人脸技术的应用,
OpenCVforUnity人脸识别插件:Unity3D中的实时人脸检测解决方案
OpenCVforUnity人脸识别插件:Unity3D中的实时人脸检测解决方案【下载地址】OpenCVforUnity人脸识别插件OpenCVforUnity人脸识别插件专为Unity3D开发者设计,帮助轻松实现高效的人脸识别功能。该插件支持摄像头画面的实时检测,精准比对面部特征,适用于刷脸验证等交互场景。集成简单快捷,符合Unity开发习惯,同时具备良好的可扩展性,方便二次开发与功能定制。无论
视觉表征和多模态融合
一只齐刘海的猫
语言模型
视觉表征和多模态融合是当前人工智能领域的研究热点,特别是在计算机视觉和自然语言处理的交叉领域。视觉表征是指将图像或视频信息转化为模型可以处理的向量形式,而多模态融合则是将不同类型的数据(如视觉、文本、音频等)进行整合,以实现更全面、准确的信息理解和处理。视觉表征(VisualRepresentation)目的:将图像或视频数据转化为深度学习模型可以理解的特征向量。方法:卷积神经网络(CNN):传
opencv-c++
一、基础类型与图像视频读取1、基础类型1、接口类类型说明InputArray只读输入数组传递到OpenCV函数的代理类OutputArray这种类型与InputArray非常相似,只是它用于输入/输出和输出函数参数InputOutputArray继承了OutputArray,作为输入输出接口,增加了一些功能InputArrayOfArraystypedefInputArrayInputArrayO
机器视觉OpenCV:OpenCV图像基本操作
数字化与智能化
机器学习之机器视觉 opencv 人工智能 计算机视觉
一、图像读写操作(一)读取图像方法:cv2.imread(filename,flags=None)参数说明:filename(字符串):-必须参数。-指定要读取的图像文件的路径。可以是相对路径或绝对路径。-支持多种图像格式,如.jpg,.png,.bmp,.tiff,.jpeg等。flags(整数):-可选参数。-指定读取图像的方式。不同的标志位会影响图像的加载方式。-常见的标志位包括:-cv2.
基于opencv的疲劳驾驶监测系统
博主介绍:java高级开发,从事互联网行业多年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的毕业设计程序开发,开发过上千套毕业设计程序,没有什么华丽的语言,只有实实在在的写点程序。文末点击卡片获取联系技术:python+opencv+dlib1、研究背景研究背景随着交通运输业的迅猛发展,汽车保有量持续攀升,道路交通流量大幅增加,疲劳驾驶已成为引发交通事故的
从0到1掌握OpenCV!Python图像处理实战全解析(附代码+案例)
小张在编程
Python学习 opencv python 图像处理
引言你有没有想过,手机里的美颜滤镜如何精准识别五官?监控摄像头如何在人流中锁定可疑目标?医学影像软件如何从CT片中快速标注病灶?这些“神奇操作”的背后,往往藏着一个低调的“图像处理神器”——OpenCV。作为Python生态中最受欢迎的计算机视觉库,它用一行行代码将抽象的像素点变成可操作的“数字画布”。今天,我们就从最基础的图像读写开始,手把手带你解锁OpenCV的“十八般武艺”,从图像处理小白变
目标检测在国防和政府的应用实例
MzKyle
计算机视觉 目标检测 人工智能 计算机视觉
一、目标检测技术概述目标检测是计算机视觉的核心任务,通过算法对图像/视频中的物体进行识别与定位,当前主流技术包括:经典算法:YOLO系列(实时性强)、FasterR-CNN(精度高)、SSD(平衡速度与精度)技术升级:结合深度学习(CNN、Transformer)、多模态融合(视觉+红外+雷达)、边缘计算实时处理二、国防领域核心应用实例(一)军事侦察与监控系统无人机侦察与目标识别应用场景:战术无人
OpenCV CUDA模块设备层-----在GPU 上高效地执行两个 uint 类型值的最大值比较函数vmax2()
村北头的码农
OpenCV opencv 人工智能 计算机视觉
操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述OpenCV的CUDA模块(cudev)中的一个设备端内联函数,用于在GPU上高效地执行两个uint类型值的最大值比较。该函数返回两个无符号整数a和b中的较大值:return(a>b)?a:b;函数原型__device____forceinline__uintcv
OpenCV中超分辨率(Super Resolution)模块类cv::dnn_superres::DnnSuperResImpl
村北头的码农
OpenCV opencv dnn 人工智能
操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述OpenCV中超分辨率(SuperResolution)模块的一个内部实现类。它属于dnn_superres模块,用于加载和运行基于深度学习的图像超分辨率模型。这个类是OpenCV中用于执行深度学习超分辨率推理的主要类。你可以用它来加载预训练的超分辨率模型(如ED
VLA模型
一介绍在机器人领域,视觉-语言-动作(VLA)模型的发展经历了显著的演变,这得益于计算机视觉和自然语言处理领域的进步。VLA模型代表了一类旨在处理多模态输入的模型,整合了来自视觉、语言和动作的信息。这些模型对于实现具身智能至关重要,使机器人能够理解物理世界并与之互动。以下是VLA模型发展的时间线:早期阶段:计算机视觉和自然语言处理的集成大约在2015年开始,随着视觉问答(VQA)系统的出现。这些系
Random Erasing:计算机视觉的「隐形斗篷」——遮挡艺术的对抗学习革命
星光银河
深度学习-代表性技术主题 / 概念层面 计算机视觉 学习 人工智能 cnn 神经网络 深度学习
当ImageNet冠军模型在真实世界的遮挡面前崩溃时(识别准确率骤降38%),中科院自动化研究所2017年提出的RandomErasing技术以一纸惊艳了学界。这种在图像中随机挖洞的简单操作,让ResNet-50在Partial-iNaturalist数据集上抗遮挡能力提升4.2倍,错误率降低59%,揭示了模型鲁棒性的深层密码。️遮挡困境:视觉模型的阿喀琉斯之踵图像识别鲁棒性演化史时代技术Imag
AI人工智能与自动驾驶的协同创新模式
AI大模型应用之禅
人工智能 自动驾驶 机器学习 ai
AI人工智能与自动驾驶的协同创新模式关键词:人工智能、自动驾驶、协同创新、深度学习、计算机视觉、传感器融合、决策系统摘要:本文深入探讨了人工智能与自动驾驶技术的协同创新模式。我们将从基础概念出发,逐步分析AI如何赋能自动驾驶系统,涵盖感知、决策和控制三大核心模块。文章将通过生动的比喻解释复杂技术原理,展示实际代码实现,并探讨未来发展趋势和挑战。通过这篇文章,读者将全面理解AI与自动驾驶如何相互促进
基于 OpenCV 的图像 ROI 切割实现
一、引言在计算机视觉领域,我们经常需要处理各种各样的图像数据。有时候,我们只对图像中的某一部分区域感兴趣,例如在一张人物照片中,我们可能只关注人物的脸部。在这种情况下,将我们感兴趣的区域从整个图像中切割出来,不仅可以节省计算量,还能提高程序的运行速度。这就是我们所说的ROI(RegionofInterest,感兴趣区域)切割。二、ROI切割的原理2.1图像数据的存储在使用OpenCV进行图像读取时
【Python】车牌自动识别
幽兰的天空
Python python opencv
实现车牌自动识别(LicensePlateRecognition,LPR)是计算机视觉和深度学习领域中的一个常见任务。用Python和OpenCV,结合其他深度学习库,可以建立一个简单的车牌识别系统。以下是一个基于这两者的基本实现思路和示例代码。实现步骤环境准备:安装必要的库:bashpipinstallopencv-pythonopencv-python-headlessnumpypillowp
Java实现的基于模板的网页结构化信息精准抽取组件:HtmlExtractor
yangshangchuan
信息抽取 HtmlExtractor 精准抽取 信息采集
HtmlExtractor是一个Java实现的基于模板的网页结构化信息精准抽取组件,本身并不包含爬虫功能,但可被爬虫或其他程序调用以便更精准地对网页结构化信息进行抽取。
HtmlExtractor是为大规模分布式环境设计的,采用主从架构,主节点负责维护抽取规则,从节点向主节点请求抽取规则,当抽取规则发生变化,主节点主动通知从节点,从而能实现抽取规则变化之后的实时动态生效。
如
java编程思想 -- 多态
百合不是茶
java 多态详解
一: 向上转型和向下转型
面向对象中的转型只会发生在有继承关系的子类和父类中(接口的实现也包括在这里)。父类:人 子类:男人向上转型: Person p = new Man() ; //向上转型不需要强制类型转化向下转型: Man man =
[自动数据处理]稳扎稳打,逐步形成自有ADP系统体系
comsci
dp
对于国内的IT行业来讲,虽然我们已经有了"两弹一星",在局部领域形成了自己独有的技术特征,并初步摆脱了国外的控制...但是前面的路还很长....
首先是我们的自动数据处理系统还无法处理很多高级工程...中等规模的拓扑分析系统也没有完成,更加复杂的
storm 自定义 日志文件
商人shang
storm cluster logback
Storm中的日志级级别默认为INFO,并且,日志文件是根据worker号来进行区分的,这样,同一个log文件中的信息不一定是一个业务的,这样就会有以下两个需求出现:
1. 想要进行一些调试信息的输出
2. 调试信息或者业务日志信息想要输出到一些固定的文件中
不要怕,不要烦恼,其实Storm已经提供了这样的支持,可以通过自定义logback 下的 cluster.xml 来输
Extjs3 SpringMVC使用 @RequestBody 标签问题记录
21jhf
springMVC使用 @RequestBody(required = false) UserVO userInfo
传递json对象数据,往往会出现http 415,400,500等错误,总结一下需要使用ajax提交json数据才行,ajax提交使用proxy,参数为jsonData,不能为params;另外,需要设置Content-type属性为json,代码如下:
(由于使用了父类aaa
一些排错方法
文强chu
方法
1、java.lang.IllegalStateException: Class invariant violation
at org.apache.log4j.LogManager.getLoggerRepository(LogManager.java:199)at org.apache.log4j.LogManager.getLogger(LogManager.java:228)
at o
Swing中文件恢复我觉得很难
小桔子
swing
我那个草了!老大怎么回事,怎么做项目评估的?只会说相信你可以做的,试一下,有的是时间!
用java开发一个图文处理工具,类似word,任意位置插入、拖动、删除图片以及文本等。文本框、流程图等,数据保存数据库,其余可保存pdf格式。ok,姐姐千辛万苦,
php 文件操作
aichenglong
PHP 读取文件 写入文件
1 写入文件
@$fp=fopen("$DOCUMENT_ROOT/order.txt", "ab");
if(!$fp){
echo "open file error" ;
exit;
}
$outputstring="date:"." \t tire:".$tire."
MySQL的btree索引和hash索引的区别
AILIKES
数据结构 mysql 算法
Hash 索引结构的特殊性,其 检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。
可能很多人又有疑问了,既然 Hash 索引的效率要比 B-Tree 高很多,为什么大家不都用 Hash 索引而还要使用 B-Tree 索引呢
JAVA的抽象--- 接口 --实现
百合不是茶
抽象 接口 实现接口
//抽象 类 ,方法
//定义一个公共抽象的类 ,并在类中定义一个抽象的方法体
抽象的定义使用abstract
abstract class A 定义一个抽象类 例如:
//定义一个基类
public abstract class A{
//抽象类不能用来实例化,只能用来继承
//
JS变量作用域实例
bijian1013
作用域
<script>
var scope='hello';
function a(){
console.log(scope); //undefined
var scope='world';
console.log(scope); //world
console.log(b);
TDD实践(二)
bijian1013
java TDD
实践题目:分解质因数
Step1:
单元测试:
package com.bijian.study.factor.test;
import java.util.Arrays;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import com.bijian.
[MongoDB学习笔记一]MongoDB主从复制
bit1129
mongodb
MongoDB称为分布式数据库,主要原因是1.基于副本集的数据备份, 2.基于切片的数据扩容。副本集解决数据的读写性能问题,切片解决了MongoDB的数据扩容问题。
事实上,MongoDB提供了主从复制和副本复制两种备份方式,在MongoDB的主从复制和副本复制集群环境中,只有一台作为主服务器,另外一台或者多台服务器作为从服务器。 本文介绍MongoDB的主从复制模式,需要指明
【HBase五】Java API操作HBase
bit1129
hbase
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.ha
python调用zabbix api接口实时展示数据
ronin47
zabbix api接口来进行展示。经过思考之后,计划获取如下内容: 1、 获得认证密钥 2、 获取zabbix所有的主机组 3、 获取单个组下的所有主机 4、 获取某个主机下的所有监控项  
jsp取得绝对路径
byalias
绝对路径
在JavaWeb开发中,常使用绝对路径的方式来引入JavaScript和CSS文件,这样可以避免因为目录变动导致引入文件找不到的情况,常用的做法如下:
一、使用${pageContext.request.contextPath}
代码” ${pageContext.request.contextPath}”的作用是取出部署的应用程序名,这样不管如何部署,所用路径都是正确的。
Java定时任务调度:用ExecutorService取代Timer
bylijinnan
java
《Java并发编程实战》一书提到的用ExecutorService取代Java Timer有几个理由,我认为其中最重要的理由是:
如果TimerTask抛出未检查的异常,Timer将会产生无法预料的行为。Timer线程并不捕获异常,所以 TimerTask抛出的未检查的异常会终止timer线程。这种情况下,Timer也不会再重新恢复线程的执行了;它错误的认为整个Timer都被取消了。此时,已经被
SQL 优化原则
chicony
sql
一、问题的提出
在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一。系统优化中一个很重要的方面就是SQL语句的优化。对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统
java 线程弹球小游戏
CrazyMizzz
java 游戏
最近java学到线程,于是做了一个线程弹球的小游戏,不过还没完善
这里是提纲
1.线程弹球游戏实现
1.实现界面需要使用哪些API类
JFrame
JPanel
JButton
FlowLayout
Graphics2D
Thread
Color
ActionListener
ActionEvent
MouseListener
Mouse
hadoop jps出现process information unavailable提示解决办法
daizj
hadoop jps
hadoop jps出现process information unavailable提示解决办法
jps时出现如下信息:
3019 -- process information unavailable3053 -- process information unavailable2985 -- process information unavailable2917 --
PHP图片水印缩放类实现
dcj3sjt126com
PHP
<?php
class Image{
private $path;
function __construct($path='./'){
$this->path=rtrim($path,'/').'/';
}
//水印函数,参数:背景图,水印图,位置,前缀,TMD透明度
public function water($b,$l,$pos
IOS控件学习:UILabel常用属性与用法
dcj3sjt126com
ios UILabel
参考网站:
http://shijue.me/show_text/521c396a8ddf876566000007
http://www.tuicool.com/articles/zquENb
http://blog.csdn.net/a451493485/article/details/9454695
http://wiki.eoe.cn/page/iOS_pptl_artile_281
完全手动建立maven骨架
eksliang
java eclipse Web
建一个 JAVA 项目 :
mvn archetype:create
-DgroupId=com.demo
-DartifactId=App
[-Dversion=0.0.1-SNAPSHOT]
[-Dpackaging=jar]
建一个 web 项目 :
mvn archetype:create
-DgroupId=com.demo
-DartifactId=web-a
配置清单
gengzg
配置
1、修改grub启动的内核版本
vi /boot/grub/grub.conf
将default 0改为1
拷贝mt7601Usta.ko到/lib文件夹
拷贝RT2870STA.dat到 /etc/Wireless/RT2870STA/文件夹
拷贝wifiscan到bin文件夹,chmod 775 /bin/wifiscan
拷贝wifiget.sh到bin文件夹,chm
Windows端口被占用处理方法
huqiji
windows
以下文章主要以80端口号为例,如果想知道其他的端口号也可以使用该方法..........................1、在windows下如何查看80端口占用情况?是被哪个进程占用?如何终止等. 这里主要是用到windows下的DOS工具,点击"开始"--"运行",输入&
开源ckplayer 网页播放器, 跨平台(html5, mobile),flv, f4v, mp4, rtmp协议. webm, ogg, m3u8 !
天梯梦
mobile
CKplayer,其全称为超酷flv播放器,它是一款用于网页上播放视频的软件,支持的格式有:http协议上的flv,f4v,mp4格式,同时支持rtmp视频流格 式播放,此播放器的特点在于用户可以自己定义播放器的风格,诸如播放/暂停按钮,静音按钮,全屏按钮都是以外部图片接口形式调用,用户根据自己的需要制作 出播放器风格所需要使用的各个按钮图片然后替换掉原始风格里相应的图片就可以制作出自己的风格了,
简单工厂设计模式
hm4123660
java 工厂设计模式 简单工厂模式
简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式。是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
maven笔记
zhb8015
maven
跳过测试阶段:
mvn package -DskipTests
临时性跳过测试代码的编译:
mvn package -Dmaven.test.skip=true
maven.test.skip同时控制maven-compiler-plugin和maven-surefire-plugin两个插件的行为,即跳过编译,又跳过测试。
指定测试类
mvn test
非mapreduce生成Hfile,然后导入hbase当中
Stark_Summer
map hbase reduce Hfile path实例
最近一个群友的boss让研究hbase,让hbase的入库速度达到5w+/s,这可愁死了,4台个人电脑组成的集群,多线程入库调了好久,速度也才1w左右,都没有达到理想的那种速度,然后就想到了这种方式,但是网上多是用mapreduce来实现入库,而现在的需求是实时入库,不生成文件了,所以就只能自己用代码实现了,但是网上查了很多资料都没有查到,最后在一个网友的指引下,看了源码,最后找到了生成Hfile
jsp web tomcat 编码问题
王新春
tomcat jsp pageEncode
今天配置jsp项目在tomcat上,windows上正常,而linux上显示乱码,最后定位原因为tomcat 的server.xml 文件的配置,添加 URIEncoding 属性:
<Connector port="8080" protocol="HTTP/1.1"
connectionTi