小编McM*_*cMa的帖子

MatLab瓶颈

我正在使用大数组(大约6x40万)并且我的代码显示出很大的瓶颈.我在MatLab中经验丰富,但对内部过程(如内存等)知之甚少.

我的代码如下所示(只是必需品,当然所有变量都被初始化,特别是循环中的数组,我只是不想用代码轰炸你们所有人):

首先我读了这个文件,

 disp('Point cloud import and subsampling')
    tic
    fid=fopen(strcat(Name,'.dat'));
    C=textscan(fid, '%d%d%f%f%f%d'); %<= Big!
    fclose(fid);
Run Code Online (Sandbox Code Playgroud)

然后从内容中创建数组,

    y=C{1}(1:Subsampling:end)/Subsampling;
    x=C{2}(1:Subsampling:end)/Subsampling;
    %... and so on for the other rows    

    clear C %No one wants 400+ millon doubles just lying around.
Run Code Online (Sandbox Code Playgroud)

并清除单元格数组(1),并使用新值创建一些图像和数组

for i=1:length(x)

    PCImage(y(i)+SubSize(1)-maxy+1,x(i)+1-minx)=Reflectanse(i);     
    PixelCoordinates(y(i)+SubSize(1)-maxy+1,x(i)+1-minx,:)=Coordinates(i,:);

end
toc
Run Code Online (Sandbox Code Playgroud)

在此之前,所有东西都或多或少地运行,但随后我操纵了一些数组

disp('Overlap alignment')
   tic

    PCImage=PCImage(:,[1:maxx/2-Overlap,maxx/2:end-Overlap]); %-30 overlap?
    PixelCoordinates=PixelCoordinates(:,[1:maxx/2-Overlap,maxx/2:end-Overlap],:);
    Sphere=Sphere(:,[1:maxx/2-Overlap,maxx/2:end-Overlap],:);

toc 
Run Code Online (Sandbox Code Playgroud)

这是一个很大的瓶颈,但下一步会变得更糟

disp('Planar view and point cloud matching')
   tic

   CompImage=zeros(max(SubSize(1),PCSize(1)),max(SubSize(2),PCSize(2)),3);

   CompImage(1:SubSize(1),1:SubSize(2),2)=Subimage; %ExportImage Cyan
   CompImage(1:SubSize(1),1:SubSize(2),3)=Subimage;
   CompImage(1:PCSize(1),1:PCSize(2),1)=PCImage; %PointCloudImage Red

  toc
Run Code Online (Sandbox Code Playgroud)

产量

点云导入和子采样

经过的时间是181.157182秒.

重叠对齐

经过的时间是408.750932秒.

平面视图和点云匹配

经过的时间是719.383807秒. …

arrays matlab

6
推荐指数
1
解决办法
146
查看次数

仿射变换重新缩放

我在图像中检测到一个显着区域,我执行了一系列操作,最重要的是仿射归一化(将椭圆转换为圆形,将梯形转换为等边矩形).

仿射归一化是矩阵中剪切和缩放的组合,如下所示:

Chol=[a,b           
      0,c]
Run Code Online (Sandbox Code Playgroud)

a,[0,1]中的c和[-1,1]中的b(对于那些感兴趣的人,它是检测到的区域的协方差矩阵的Cholesky分解的逆矩阵).

一切正常,直到这里,但是当我将变换应用到原始帧时

AffineFrame=cv.warpAffine(RealFrame,[Chol,[0;0]],... 
                          'DSize',[RealFrameSize(1),RealFrameSize(2)]);          
% that's dst=cv.warpAffine(src,trafo) with trafo: 2x3 Matrix (here Chol and [0,0] translation) 
Run Code Online (Sandbox Code Playgroud)

我得到一个未缩放的图像,转换和图像大小:  图像无效,转换和图像大小.

我真正想要的是 - 并且通过这条线的试错来实现这个特定的框架

AffineFrame=cv.warpAffine(RealFrame,[Chol,[0;0]]*S,... 
                          'DSize',[RealFrameSize(1)*X,RealFrameSize(2)*Y]);  
Run Code Online (Sandbox Code Playgroud)

看起来像这样:

想!.

我知道问题在于缩放S,XY.如果有人知道如何计算这个,你将节省我回到学校几何的漫长旅程!(我已经拥有了可以从第二个图像时刻中提取的所有几何信息,如市长和短轴,各自的幅度,偏心率等等.)

编辑:一些典型值(不一定是这种情况):

Chol = 0.43  -0.23
       0      0.67
Run Code Online (Sandbox Code Playgroud)

这个想法我有XY:与LW主轴线和次轴线的大小(变化很大,这取决于形状通常约5和50):

X=(1+L/(L+W));
Y=(1+W/(L+W));
Run Code Online (Sandbox Code Playgroud)

仅当剪切Chol不大时才有效.S取决于形状,在5到30之间做得很好.

math matlab opencv image-processing affinetransform

5
推荐指数
1
解决办法
859
查看次数

MatLab减少绘制图像中的bitdepth?

我正在绘制两个场景之间的功能匹配,如下所示:

%...import, preprocessing, and stuff

%"Sandwich" Image1 and Image2 in a new image Image
ImSize=[size(Image1,1)+size(Image2,1),max(size(Image2,2),size(Image2,2))];

Image=zeros(ImSize);
Image(1:size(Image1,1),1:size(Image1,2))=Image1;
Image(size(Image1,1)+1:end,1:size(Image2,2))=Image2;

%show Image
imshow(Image,[]);
hold on

%plot keypoints and matching lines in all colors
cc=hsv(size(Keypoints1,1));

for ii=1:size(Keypoints1,1)

    plot(Keypoints1(ii,1),Keypoints1(ii,2),'o','color',cc(ii,:))
    plot(Keypoints2(ii,1),Keypoints2(ii,2)+size(Image1,1),'o','color',cc(ii,:))

    line([Keypoints1(ii,1),Keypoints2(ii,1)],[Keypoints1(ii,2),Keypoints2(ii,2)+size(Image1,1)],'color',cc(ii,:),'LineWidth',0.5)
end
Run Code Online (Sandbox Code Playgroud)

这个正常工作正常,Matlab绘制了整个bitdepth 在此输入图像描述

但随着行数的增加,我将开始看到导致二进制图像甚至全黑的bitdepth减少: 在此输入图像描述

我知道密谋这么多线远非理想,但我仍然想知道为什么会这样.是否有任何matlab数据机制我应该理解解释这种行为?

注意:这只是显示图像的问题,将它们保存为.bmp,jpg,...将生成正常图片.

matlab plot

5
推荐指数
1
解决办法
74
查看次数

将函数的帮助存储在MATLAB中的变量中

我想创建一个html文件来打印包含一个文件夹中所有功能的讲义.有没有办法以编程方式访问每个函数的帮助,以准备字符串输入?

getfunchelp()在这样的程序中,我正在思考虚构的事情:

Functions=dir('*.m');

fid = fopen('FunctionSummary.htm','a');
fprintf(fid, ['<HTML><HEAD><TITLE> Function Summary </TITLE>\n']);

for ii=1:length(Functions)

   FunctionName=Functions(ii).name;
   FunctionHelp=getfunchelp(FunctionName); % <= This one over here

   fprintf(fid, ['<H2>',FunctionName,'</H2>']);
   fprintf(fid, ['\n<BR><i>',FunctionHelp,'</i> ']); 
    %... 

end

 fclose(fid);
Run Code Online (Sandbox Code Playgroud)

或者有更好的方法吗?(如果publish()不打印其余的功能代码,可以更容易实现吗?)

documentation matlab printf

1
推荐指数
1
解决办法
33
查看次数