Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 指定提取的冲浪点的大小_Matlab_Image Processing_Matlab Cvst_Surf - Fatal编程技术网

Matlab 指定提取的冲浪点的大小

Matlab 指定提取的冲浪点的大小,matlab,image-processing,matlab-cvst,surf,Matlab,Image Processing,Matlab Cvst,Surf,我试图提取冲浪点,以便在输入图像和训练图像集之间进行模式匹配。我已经修改了MATLAB的猪检测代码。但是,我得到了一个错误,因为不同图像的冲浪功能大小不同。这在HOG探测器中通过细胞大小进行了说明,但是对于冲浪点没有这样的参数 有没有办法确保所有图像的冲浪功能大小相同 错误: 下标赋值维度不匹配。 SURF2中的错误 特征(i,:)=提取特征(img,点) %1。加载图像集 imgSets=[imageSet(完整文件('Patterns','Cat1')。。。 图像集(完整文件('Patter

我试图提取冲浪点,以便在输入图像和训练图像集之间进行模式匹配。我已经修改了MATLAB的猪检测代码。但是,我得到了一个错误,因为不同图像的冲浪功能大小不同。这在HOG探测器中通过细胞大小进行了说明,但是对于冲浪点没有这样的参数

有没有办法确保所有图像的冲浪功能大小相同

错误: 下标赋值维度不匹配。 SURF2中的错误 特征(i,:)=提取特征(img,点)

%1。加载图像集
imgSets=[imageSet(完整文件('Patterns','Cat1')。。。
图像集(完整文件('Patterns','Cat2')。。。
图像集(完整文件('Patterns','Cat3'))。。。
图像集(fullfile('Patterns','Cat4'))];
{imgSets.Description}%在一行上显示所有标签
[imgSets.Count]%显示相应的图像计数
%2.准备培训和验证图像集
%2.1每个训练集的平衡编号
%确定类别中图像的最小数量
minSetCount=min([imgSets.Count]);
%使用分区方法修剪集合。
imgSets=分区(imgSets,minSetCount,“随机化”);
%请注意,现在每个集的图像数量完全相同。
[imgSets.Count]
%2.2培训和验证数据的单独数据集。30%的图像
%用于培训数据,其余70%用于验证数据
[trainingSets,validationSets]=分区(imgSets,0.3,“随机化”);
img=读取(训练集(3),4);
img=rgb2gray(img);
%3.检测冲浪点
点=检测特征(img);
点数=点数。选择最强(15);
[专长,点数]=提取特征(img,点数);
SURFFeatureSize=长度(专长);
培训特点=[];
培训标签=[];
对于数字=1:numel(培训集)
numImages1=训练集(数字)。计数;
特征=零(numImages1,SURFFeatureSize,'single');
对于i=1:numImages1
img=读取(训练集(数字),i);
img=rgb2gray(img);
点=检测特征(img);
特征(i,:)=提取特征(img,点);
结束
如果数字=1%,格子图案=5
标签=[培训集(数字).说明,空白(6)];
结束
如果数字=2%,无图案=11
标签=[培训集(数字).说明];
结束
如果数字==3%,条带化=7
标签=[培训集(数字).说明,空白(4)];
结束
如果数字=4%,则不规则=9
标签=[培训集(数字).说明,空白(2)];
结束
%使用图像集描述作为培训标签。
标签=repmat(标签,数字图像1,1);
trainingFeatures=[trainingFeatures;features];%#好啊
trainingLabels=[trainingLabels;labels];%#好啊
结束

谢谢。

根据@rayryeng提供的评论,我已将检测到的特征数组填充到一个设定的预期数组大小,如下所示:

img = read(trainingSets(3), 4);
img = rgb2gray(img);
%3.   Detect SURF Points
points =detectSURFFeatures(img);
points = points.selectStrongest(15);
[feats,vPoints] = extractFeatures(img,points);
currentSize = size(feats);
rowSize = currentSize (:,1);
expectedRowSize = 15;
differenceRowSize = abs(expectedRowSize- rowSize);

if rowSize ~= expectedRowSize
    z =zeros(differenceRowSize,64,'single');
    feats= vertcat(feats,z);
end
还有其他方法来填充阵列(例如使用padarray),但我更熟悉这种方法


请随时提供任何有利于他人的替代方法

不能像使用HOG那样直接使用SURF
extractHOGFeatures
计算一个描述整个图像的直方图,而
extractSURFFeatures
获取一组点,并计算每个点周围的描述符,因此它返回多个向量
extractHOGFeatures
也可以计算点描述符,但是
extractSURFFeatures
无法计算全局图像描述符


如果您想使用SURF进行图像分类,如数字识别,则需要将一组SURF描述符转换为单个向量。一种方法是使用

您无法强制每个图像的最小或最大冲浪点数。有两个选项:(1)使用单元阵列并将每组要素放置在单元中。(2) 如果检测到的功能总数少于您预期的数量,则用最多检测到的功能填充该列,然后用某些内容填充其余缺少的功能。。。就像零一样。@rayryeng我现在正在实现第二个选项。我不确定第一个选项(使用单元格数组)将如何工作,但第二个选项应该是找到的。谢谢。你想让我写一个答案,还是你已经明白了?@rayryeng我对我的实现发表了评论。如果你认为其他人会从中受益,请随意发表另一篇文章。我正在学习如何使用单元阵列来实现它。不幸的是,这是行不通的。是的,这将使功能集大小相同,但此填充没有任何语义含义。它不会帮助您对图像进行分类。@Dima谢谢!您能否详细说明我如何为描述符(如BRISK、FAST等)实现特征包方法,因为特征包函数使用SURF@Dima,我尝试创建代表该矩阵的特征向量。我是stackoverflow新手,我应该创建一个关于它的新问题还是编辑这个问题?谢谢,这很有道理!谢谢但是,如果我想提取快速或快速的特征,从而给出一个描述符矩阵,我如何将其转换为一袋单词?bag of features功能仅在冲浪时自动执行此操作
img = read(trainingSets(3), 4);
img = rgb2gray(img);
%3.   Detect SURF Points
points =detectSURFFeatures(img);
points = points.selectStrongest(15);
[feats,vPoints] = extractFeatures(img,points);
currentSize = size(feats);
rowSize = currentSize (:,1);
expectedRowSize = 15;
differenceRowSize = abs(expectedRowSize- rowSize);

if rowSize ~= expectedRowSize
    z =zeros(differenceRowSize,64,'single');
    feats= vertcat(feats,z);
end