算法效果比较博文
用于表示和量化图像的数字列表,简单理解成将转化为一个数字列表表示。特征向量中用来描述的各种属性的向量称为特征矢量。
参考
是一种算法和方法,输入1个图像,返回多个特征向量(主要用来处理图像的局部,往往会把多个特征向量组成一个一维的向量)。主要用于图像匹配(视觉检测),匹配图像中的物品。
SIFT论文
原理
opencv官网解释
实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。
尺度不变特征转换(Scale-invariant feature transform或SIFT)是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量。
其应用范围包含物体辨识、机器人地图感知与导航、影像缝合、3D模型建立、手势辨识、影像追踪和动作比对。
对现实中物体的描述一定要在一个十分重要的前提下进行,这个前提就是对自然界建模时的尺度。当用一个机器视觉系统分析未知场景时,计算机没有办法预先知道图像中物体的尺度,因此我们需要同时考虑图像在多尺度下的描述,获知感兴趣物体的最佳尺度。图像的尺度空间表达指的是图像的所有尺度下的描述。
KeyPoint数据结构解析
SURF论文
原理
opencv官网解释
SURF是SIFT的加速版,它善于处理具有模糊和旋转的图像,但是不善于处理视角变化和光照变化。在SIFT中使用DoG对LoG进行近似,而在SURF中使用盒子滤波器对LoG进行近似,这样就可以使用积分图像了(计算图像中某个窗口内所有像素和时,计算量的大小与窗口大小无关)。总之,SURF最大的特点在于采用了Haar特征以及积分图像的概念,大大加快了程序的运行效率。
因为专利原因,OpenCV33开始不再免费开放SIFT\SURF,需要免费的请使用ORB算法
ORB算法综合了FAST角点检测算法和BRIEFF描述符。
算法原理
opencv官方文档
FAST只是一种特征点检测算法,并不涉及特征点的特征描述。
论文
opencv官方文档
中文版
Brief是Binary Robust Independent Elementary Features的缩写。这个特征描述子是由EPFL的Calonder在ECCV2010上提出的。主要思路就是在特征点附近随机选取若干点对,将这些点对的灰度值的大小,组合成一个二进制串,并将这个二进制串作为该特征点的特征描述子。文章同样提到,在此之前,需要选取合适的gaussian kernel对图像做平滑处理。
1:不具备旋转不变性。
2:对噪声敏感
3:不具备尺度不变性。
ORB论文
OpenCV官方文档
ORB采用了FAST作为特征点检测算子,特征点的主方向是通过矩(moment)计算而来解决了BRIEF不具备旋转不变性的问题。
ORB还做了这样的改进,不再使用pixel-pair,而是使用9×9的patch-pair,也就是说,对比patch的像素值之和,解决了BRIEF对噪声敏感的问题。
关于计算速度:
ORB是sift的100倍,是surf的10倍。
对数据、特征分布的一种统计
对数据空间(bin)进行量化
Kmeans
边缘:尺度问题->不同的标准差 捕捉到不同尺度的边缘
斑点 Blob:二阶高斯导数滤波LoG
关键点(keypoint):不同视角之间的映射,配准、拼接、运动跟踪、物体识别、机器人导航、3D重建
SIFT\SURF
现在在vc上采集视频常用的方法有三:vfw,directshow,opencv
你是要进行图像处理的话推荐opencv(具体参考:于仕琪,opencv教程基础篇中的例3-6,稍作修改,估计就能用于你的工程)
下面贴出我自己编的一个小工程:如有疑问,E-mail:zhoutingzhi@gmailcom
进行opencv的预备 *** 作你要看那本书和逛opencv中文网
如有问题可以和我讨论(我也是菜鸟,刚为解决了这个问题窃喜不已)。
1新建mfc对话框工程,在其中添加一个picture控件,除了ID以外什么都不用改
2在对话框头文件(没有Dlg那个)中添加(最好是在“#include "resourceh" // main symbols之后”):
#include "cxcoreh"
#include "cvcamh"
#include "windowsh"
#include "cvh"
#include "highguih"
3在工程-》设置-》选择所有配置-》link(连接)-》对象/库模块-》中添加:
kernel32lib user32lib gdi32lib winspoollib comdlg32lib advapi32lib shell32lib ole32lib oleaut32lib uuidlib odbc32lib odbccp32lib cxcorelib cvlib mllib cvauxlib highguilib cvcamlib
4在需要触发摄像头显示的地方添加:
void CVideomfcDlg::OnButton1()
{
// TODO: Add your control notification handler code here
int ncams = cvcamGetCamerasCount( );//返回可以访问的摄像头数目
HWND MyWin=::GetDlgItem(m_hWnd,IDC_VIDEO); //获得控件句柄(IDC_VIDEO就是控件)
cvcamSetProperty(0, CVCAM_PROP_ENABLE, CVCAMTRUE); //选择第一个摄像头
int width=240;
int height=240;
cvcamSetProperty(0,CVCAM_PROP_WINDOW, &MyWin); // Selects a window for
cvcamSetProperty(0,CVCAM_RNDWIDTH, &width);
cvcamSetProperty(0,CVCAM_RNDHEIGHT, &height);
cvcamSetProperty(0, CVCAM_PROP_CALLBACK, callback1);
//回调函数将处理每一帧
cvcamInit( );
cvcamStart( );
}
5改变显示的图像序列大小,在窗口属性设定了以后,添加如下代码:
int width=320; //这个就是需要显示的窗口大小
int height=240; //根据自己需要选择
cvcamSetProperty(0,CVCAM_RNDWIDTH, &width);
cvcamSetProperty(0,CVCAM_RNDHEIGHT, &height);
6在对话框类中添加callback成员函数(注意,在添加函数的时候,一定要选择static,不选的话你就自己郁闷去吧,反正我是为了这个郁闷了2个礼拜)
void CVideomfcDlg::callback1(IplImage image)
{
IplImage image1 = image;
int i,j;
assert (image);
//获取当前系统时间
SYSTEMTIME st2=;
GetLocalTime(&st2);
char sss[18]=; //这个是用来存储所要保存的名的,用的是一个笨办法,先定义,再修改其中的数组值。
sss[7]=st2wHour/10+48; //获取系统当前小时
sss[8]=st2wHour%10+48;
sss[9]=st2wMinute/10+48; //获取系统当前分钟
sss[10]=st2wMinute%10+48;
sss[11]=st2wSecond/10+48; //获取系统当前秒
sss[12]=st2wSecond%10+48;
cvSaveImage(sss,image1); //使用系统当前时间为名称(XXXXXXjpg)存储
}
ps:你还需要在c盘根目录下建立一个叫1的文件夹保存。
祝你成功!
一个计算机数字图像它本质上来说就是由很多个像素点来组成的,而图像像素点数量是通过它长宽分辨率相乘而得到的。那么下面文章就是会来讲解一下,python获取像素以及使用像素修改其颜色的方法,想要学习这个知识的小伙伴就继续往下看看吧。
一、获取像素
matplotlib、opencv、skimage、pyplot等第三方库和模块,都有方法能够将读取到python程序中将其作为图像对象。那么像素实际上指的就是分辨率,只需要使用对象shape()这个属性即可获取,下面示例为opencv读取像素的方法:
import cv2 imagess = cv2imread(r'C:\Users\Administrator\Desktop\03jpg',-1)print(imagessshape)
或者是用skimage这个第三方库之中的模块也行,使用data模块打开一个自带的之后,使用同样的属性即可获取像素,代码示例如下所示:
from skimage import dataimg=datachelsea() rows,cols=imgshape
二、访问像素修改颜色
在文章开头就已经说过了,图像本质上就是像素点来组成的,而图像之所以多种多样的原因也在于它们的颜色不同。简单来说,可以将图像看做是xy坐标系,长宽分别对应的就是x轴以及y轴。
而且python内将读取进来打开之后的形式就是多维数组像素点,那么只需要在对象后加上中括号使用切片语法。然后再其中添加x坐标、y坐标、通道索引(写冒号就是全部颜色通道修改)作为参数,之后再去用等号赋值即可修改它的颜色,代码示例如下所示:
from skimage import io,dataimg=datachelsea() R=img[:,:,0] ioimshow(R)
以上就是关于“Python怎么读取像素?Python如何用像素修改颜色”的全部内容了,希望对你有所帮助。
您好,opencv中的flags&是一个比较常用的参数,它的作用是用来控制图像的显示和处理。它可以控制图像的颜色,大小,通道,深度,类型等属性,从而控制图像的显示和处理。比如,可以使用flags&来控制图像的颜色,大小,通道,深度,类型等属性,从而控制图像的显示和处理。例如,可以使用flags&来控制图像的颜色,大小,通道,深度,类型等属性,从而控制图像的显示和处理。此外,flags&还可以用来控制图像的缩放,旋转,裁剪,翻转等 *** 作,从而达到更好的图像处理效果。总之,flags&是一个非常有用的参数,可以控制图像的显示和处理,从而达到更好的图像处理效果。
摄像头的分辨率是摄像头自身的硬件属性所决定的,OpenCV只能从摄像头中获取到图像数据,它是不能修改摄像头本身硬件属性的。
修改分辨率有以下途径:
通过摄像头提供的SDK,自己编写代码,修改摄像头的输出分辨率
通过摄像头厂家提供的工具,譬如网页中,修改摄像头的输出分辨率
通过OpenCV提供的cv::resize函数,将摄像头输出的分辨率调整成你所需要的分辨率大小。(此种方法,摄像头自身的输出分辨率并没有改变)
以上就是关于OpenCV+Python特征提取算法与图像描述符之SIFT / SURF / ORB全部的内容,包括:OpenCV+Python特征提取算法与图像描述符之SIFT / SURF / ORB、openCV采集摄像头图片并保存的方法、python中修改像素颜色并形成一个新图像的代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)