关于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的实时视频跟踪火焰识别软件V1.0源码及exe下载
是刃小木啦~
opencv 人工智能 计算机视觉
本文介绍了基于OpenCV的实时视频跟踪火焰识别软件,该软件通过先进的图像处理技术实现对实时视频中火焰的检测与跟踪,同时支持导入图片进行火焰识别。主要功能包括相机选择、实时跟踪和图片模式。软件适用于多种场合,用于保障人民生命财产安全。源码及exe文件可通过蓝奏云网盘下载。软件简介《基于OpenCV的实时视频跟踪火焰识别软件》是一款创新的计算机视觉应用软件,旨在通过先进的图像处理技术实现对实时视频中
OpenCV 100道面试题及参考答案(7万字长文)
大模型大数据攻城狮
大厂面试 大厂面经 android面试 计算机视觉 opencv 实时互动 webrtc
OpenCV简介OpenCV(OpenSourceComputerVisionLibrary)是一个开源的计算机视觉库,它提供了丰富的函数和工具,用于处理图像和视频。OpenCV最初由英特尔公司开发,现在由一个开源社区维护和发展。主要功能和用途OpenCV的主要功能包括图像和视频处理、特征提取、目标检测、人脸识别、物体跟踪等。它可以用于各种领域,如机器人技术、医学影像、安全监控、自动驾驶等。在图像
OpenCV iOS-视频处理
源代码大师
OpenCV完整教程
OpenCViOS-视频处理OpenCViOS-视频处理先决条件:在您的iOS项目中包含OpenCV库视频帧处理项目示例用户界面添加相机处理框架基本视频处理开始提示OpenCViOS-视频处理教程介绍了如何使用iPhone的摄像头和OpenCV处理视频帧。先决条件:Xcode4.3或更高版本iOS编程的基本知识(Objective-C,界面生成器)在您的iOS项目中包含OpenCV库OpenCV库
使用OpenCV和Python将图像读取为RGB
UixnContext
opencv python 人工智能 OpenCV
在计算机视觉和图像处理中,OpenCV是一个广泛使用的开源库,提供了许多功能强大的图像处理工具。其中一个常见的任务是将图像读取为RGB格式,以便进一步处理和分析。在本文中,我将向您展示如何使用OpenCV和Python来实现这个任务。首先,确保您已经安装了OpenCV库。您可以使用以下命令在Python中安装OpenCV:pipinstallopencv-python一旦安装完成,我们可以开始写代
人工智能开发趋势
光影少年
人工智能
人工智能开发趋势:未来技术的演进与创新引言人工智能(AI)正在以惊人的速度发展,并在各行各业中发挥越来越重要的作用。从自然语言处理到计算机视觉,从自动化决策到自主学习,AI的发展方向正变得更加智能化、自动化和人性化。本文将探讨当前AI开发的最新趋势,并展望未来的发展方向。1.生成式AI的崛起近年来,生成式AI(如ChatGPT、StableDiffusion、DALL·E)展现出强大的内容创作能力
大模型驱动的智能代码生成系统
AI天才研究院
DeepSeek R1 & 大数据AI人工智能大模型 ChatGPT java python javascript kotlin golang 架构 人工智能 大厂程序员 硅基计算 碳基计算 认知计算 生物计算 深度学习 神经网络 大数据 AIGC AGI LLM 系统架构设计 软件哲学 Agent 程序员实现财富自由
大模型驱动的智能代码生成系统关键词大模型智能代码生成自然语言处理计算机视觉系统设计与实现摘要本文深入探讨了基于大模型的智能代码生成系统的构建与实现。首先,我们分析了智能代码生成的背景与意义,随后介绍了大模型的基本原理及其在代码生成中的潜力。接着,我们详细阐述了智能代码生成系统的设计与实现过程,包括系统需求分析、架构设计、模型集成与优化等方面。随后,本文通过自然语言处理、计算机视觉和代码生成应用,展
Python图片识别脚本:从零开始实现图像识别!
Python_trys
python 开发语言 编程 Python入门 Python基础 Python识别 Python学习
包含编程籽料、学习路线图、爬虫代码、安装包等!【点击领取!】图像识别是计算机视觉领域的一个重要应用,Python凭借其丰富的库和工具,成为了实现图像识别的首选语言之一。本文将带你从零开始,使用Python编写一个简单的图片识别脚本。我们将使用OpenCV和TensorFlow来实现这个功能。1.环境准备在开始之前,我们需要安装一些必要的Python库。你可以使用pip来安装这些库:pipinsta
YOLOv12改进之A2(区域注意力)
清风AI
深度学习算法详解及代码复现 深度学习 机器学习 计算机视觉 人工智能 算法
注意力回顾注意力机制作为深度学习领域的核心技术,已广泛应用于自然语言处理和计算机视觉等多个领域。在YOLOv12改进之A2中,注意力机制扮演着关键角色。已有研究成果包括:Transformer架构:引入了自注意力机制,有效捕捉输入序列中的长距离依赖关系。CBAM模块:提出了通道和空间注意力的结合,显著提升了图像分类和目标检测的性能。SENet:引入了通道注意力机制,通过自适应学习特征通道的重要性,
基于OpenCV的Java人脸识别系统设计与实现
小呀白呀兔
java spring boot
基于OpenCV的Java人脸识别系统设计与实现1.引言随着计算机视觉技术的发展,人脸识别在安全监控、身份验证等领域得到了广泛应用。本文将详细介绍如何使用OpenCV库和Java语言构建一个简单的人脸识别系统。该系统能够从图像中检测人脸,并通过深度学习模型提取特征进行比对,最终输出相似度评分及置信度等级。2.环境搭建为了确保项目顺利运行,请按照以下步骤配置开发环境:安装JDK:确保已安装JavaD
python绘制汉字_OpenCV Python 绘制中文字
weixin_39657444
python绘制汉字
By凌顺2019年9月12日本示例使用的OpenCV版本是:4.1.1运行Python的编辑器:Jupyternotebook示例目的通过使用PLI在图片上添加中文字符。PIL(PythonImagingLibrary)是Python常用的图像处理库,而Pillow是PIL的一个友好Fork,提供了了广泛的文件格式支持,强大的图像处理能力,主要包括图像储存、图像显示、格式转换以及基本的图像处理操作
OpenCV实现在图像中绘制汉字
海上的风浪
opencv 人工智能 计算机视觉 编程
在本文中,我将向您展示如何使用OpenCV库在图像中绘制汉字。OpenCV是一个广泛使用的计算机视觉库,它提供了许多强大的功能,包括图像处理和绘图。首先,我们需要安装OpenCV库。您可以通过在终端或命令提示符中运行以下命令来安装它:pipinstallopencv-python接下来,我们将使用Python编写代码来实现在图像中绘制汉字。请确保您已经安装了Python和OpenCV库。impor
【精华推荐】AI大模型学习必逛的十大顶级网站
大模型入门学习
人工智能 学习 大模型入门 llama 大模型教程 大模型学习 大模型
随着人工智能技术的快速发展,AI大模型(如GPT-3、BERT等)在自然语言处理、计算机视觉等领域取得了显著的成果。对于希望深入学习AI大模型的开发者和研究者来说,找到合适的学习资源至关重要。本文将为大家推荐十大必备网站,帮助你更好地理解和应用AI大模型。1.CourseraCoursera是一个在线学习平台,提供各类AI和机器学习课程,包括斯坦福大学的机器学习课程和深度学习专项课程。通过视频讲解
OpenCV计算摄影学(15)无缝克隆(Seamless Cloning)调整图像颜色的函数colorChange()
村北头的码农
OpenCV opencv 人工智能 计算机视觉
操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述cv::colorChange是OpenCV中用于调整图像颜色的函数。它允许你通过乘以不同的系数来独立地改变输入图像中红色、绿色和蓝色通道的强度,从而实现对图像色彩的调整。这个功能对于需要精细控制图像色调的应用非常有用。函数原型voidcv::colorChang
Python从0到100(十八):面向对象编程应用
是Dream呀
python 开发语言
前言:零基础学Python:Python从0到100最新最全教程。想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、计算机视觉、机器学习、神经网络以及人工智能相关知识,成为学习学习和学业的先行者!欢迎大家订阅专栏:零基础学Python:Python从0到100最新
在OpenCV中放大后,Python会捕捉图像的特定部分
潮易
opencv python 人工智能
在OpenCV中放大后,Python会捕捉图像的特定部分在使用OpenCV进行图像处理时,你可以通过不同的方法放大图像。以下是一些常见的方法以及Python代码示例:1.使用`cv2.resize()`函数:这是一个常用的函数,可以用来调整图像的大小。它接受三个参数:原始图像、新的尺寸以及插值方式。默认的插值方式为线性插值,但还可以选择其他如最近邻插值、双线性插值等。```pythonimport
YOLOv8改进主干RTMDet论文系列:高效涨点的单阶段目标检测器主干
IdfdFsharp
YOLO 计算机视觉
近年来,目标检测技术在计算机视觉领域取得了显著的进展。为了提高目标检测器的性能和降低延时,研究人员不断提出新的方法和架构。本文介绍了一篇名为"YOLOv8改进主干RTMDet"的论文系列,该系列通过结合最新的RTMDet论文和采用CSPNeXt主干结构,实现了高性能、低延时的单阶段目标检测器主干。在本论文系列中,作者着重研究了目标检测器主干的改进方法。主干网络在目标检测中扮演着重要的角色,它负责提
基于opencv答题卡识别判卷
深度学习乐园
深度学习实战项目 opencv 人工智能 计算机视觉
项目源码获取方式见文章末尾!回复暗号:13,免费获取600多个深度学习项目资料,快来加入社群一起学习吧。**《------往期经典推荐------》**项目名称1.【基于DDPG算法的股票量化交易】2.【卫星图像道路检测DeepLabV3Plus模型】3.【GAN模型实现二次元头像生成】4.【CNN模型实现mnist手写数字识别】5.【fasterRCNN模型实现飞机类目标检测】6.【CNN-LS
实战三、OpenCv答题卡识别判卷
Jerusalem*
opencv 人工智能 计算机视觉
importcv2importnumpyasnpANSWER_KEY={0:1,1:4,2:0,3:3,4:1}#获取坐标点deforder_points(pts):#一共4个坐标点rect=np.zeros((4,2),dtype="float32")#按顺序找到对应坐标0123分别是左上,右上,右下,左下#计算左上,右下s=pts.sum(axis=1)rect[0]=pts[np.argmi
Python项目-基于深度学习的校园人脸识别考勤系统
天天进步2015
Python项目实战 python
引言随着人工智能技术的快速发展,深度学习在计算机视觉领域的应用日益广泛。人脸识别作为其中的一个重要分支,已经在安防、金融、教育等多个领域展现出巨大的应用价值。本文将详细介绍如何使用Python和深度学习技术构建一个校园人脸识别考勤系统,该系统能够自动识别学生身份并记录考勤信息,大大提高了考勤效率,减轻了教师的工作负担。系统概述功能特点实时人脸检测与识别:能够从摄像头视频流中实时检测并识别人脸自动考
根据视觉检测流程快速入门OpenCv
不二周!
OpenCV opencv 视觉检测
一、图像读取与预处理1.1、图像读取cv2.imread(path,flags):从指定路径读取图像。path为图像路径,flags指定读取模式此外还有英文大写方式:cv2.IMREAD_COLOR(彩色模式,默认)、cv2.IMREAD_GRAYSCALE(灰度模式)、cv2.IMREAD_UNCHANGED(保留透明度通道)1.2、图像显示cv2.imshow(winname,mat):在指定
笔记-Python图片处理 (OpenCV-Python )
大白砌墙
笔记 python opencv
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和MacOS操作系统上。它轻量级而且高效——由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV-Python是OpenCV的Python的API接口,它拥有OpenCVC++API
基于opencv消除图片马赛克
小苗爸爸
opencv 人工智能 计算机视觉
以下是一个基于Python的图片马赛克消除函数实现,结合了图像处理和深度学习方法。由于马赛克消除涉及复杂的图像重建任务,建议根据实际需求选择合适的方法:importcv2importnumpyasnpfromPILimportImagedefremove_mosaic(image_path,output_path,method='traditional',block_size=10,scale_f
创建ASCII数字打印机(OpenCV C++)
河边一只猫
opencv c++ cv
学习OpenCV3(中文版)LearningOpenCV3ComputerVisioninC++withtheOpenCVLibrary第四章练习1建立一个500×500大小的单通道图像,每个像素值都为0。a.创建一个ASCII数字打印机,你可以在自己电脑上输入数字,并在一个20像素高、10像素宽的方块中显示数字。当你键入时,数字将从左到右显示,直到到达图像的末尾才停止。b.允许键入回车和退格。c
关于opencv中solvepnp中UPNP与DLS与EPNP的参数
在下李谱
opencv 人工智能 计算机视觉
ThemethodsSOLVEPNP_DLSandSOLVEPNP_UPNPcannotbeusedasthecurrentimplementationsareunstableandsometimesgivecompletelywrongresults.Ifyoupassoneofthesetwoflags,SOLVEPNP_EPNPmethodwillbeusedinstead.、由于当前的实现
【OpenCV C++】以时间命名存图,自动检查存储目录,若不存在自动创建, 按下空格、回车、Q、S自动存图
R-G-B
OpenCV C++ opencv c++ 计算机视觉
文章目录//保存图像的函数voidsaveImage(constcv::Mat&frame){//生成唯一文件名autonow=std::chrono::system_clock::
AI创业机遇:垂直领域无限可能
AGI大模型与大数据研究院
DeepSeek R1 & 大数据AI人工智能 java python javascript kotlin golang 架构 人工智能
AI创业垂直领域机器学习深度学习自然语言处理计算机视觉无人驾驶1.背景介绍人工智能(AI)正在各行各业掀起一场革命,为创业者带来了前所未有的机遇。垂直领域,即特定行业或细分市场,正在成为AI创业的热门选择。本文将深入探讨AI在垂直领域的应用,并提供实用的指南,帮助读者把握AI创业机遇。2.核心概念与联系2.1AI与垂直领域AI在垂直领域的应用,需要理解AI与垂直领域的关系。AI可以为垂直领域提供智
DeepSeek人工智能领域的创新先锋与变革力量
CodeJourney.
数据库 算法 人工智能
在科技飞速发展的时代,人工智能(AI)无疑是最具变革性的力量之一。DeepSeek作为人工智能领域的关键参与者,正以其独特的技术路径和创新理念,深刻影响着行业的发展格局。深入解读相关信息,能让我们更全面地认识DeepSeek在人工智能领域的重要贡献、技术优势、发展战略以及其带来的广泛影响。一、DeepSeek的技术突破与创新(一)核心技术成就DeepSeek在自然语言处理(NLP)和计算机视觉等人
Ubuntu20.04下VSCode配置PCL和OpenCV库-C++
Pertance
vscode opencv c++
Ubuntu20.04+VSCode+Cpp+PCL+OpenCV准备工作代码编辑:VSCode开发语言:C++编译工具:CmakeG++依赖需求:PCL/OpenCV安装PCL库sudoaptinstalllibpcl-dev配置OpenCV库安装依赖sudoapt-getinstallbuild-essentialsudoapt-getinstallcmakegitlibgtk2.0-devp
深度学习数据集封装-----目标检测篇
科研小天才
深度学习 目标检测 人工智能
前言在上篇文章中,我们深入探讨了图像分类数据集的制作流程。图像分类作为计算机视觉领域的一个基础任务,通常被认为是最为简单直接的子任务之一。然而,当我们转向目标检测任务时,复杂度便显著提升,尤其是在标注框的处理环节。不同的模型架构往往对标注框的处理方式有着各自独特的要求。以YOLO系列为例,它自有一套成熟且高效的方法来应对这一挑战。鉴于篇幅有限,本文暂不深入展开YOLO的相关内容,感兴趣的读者可以查
预训练模型微调与下游任务迁移学习技术
AGI大模型与大数据研究院
计算科学 神经计算 深度学习 神经网络 大数据 人工智能 大型语言模型 AI AGI LLM Java Python 架构设计 Agent RPA
1.背景介绍机器学习技术近年来在计算机视觉、自然语言处理等领域取得了飞速发展,这离不开大规模预训练模型的贡献。预训练模型通过在海量数据上的自监督学习,学习到了丰富的特征表示,为下游任务提供了强大的初始化。而对预训练模型进行有效的微调,可以充分利用预训练知识,在有限数据上快速达到出色的性能。此外,迁移学习技术也为模型在不同任务间的知识复用提供了有效途径。本文将详细介绍预训练模型微调与下游任务迁移学习
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