设计->风格

       一个优秀的人都有一个良好的习惯以及一个优秀的习惯。

       在建筑风格上,按照时代大致分为以下类型,而在程序设计的过程中,不同的程序员都有自己的风格,而熟悉的程序员的代码也会有熟悉的感觉,一个程序员的编程风格就跟一个建筑师的建筑风格一样重要,可以会很多建筑风格,但是必须擅长其中一二,不然就没有风格和资本在这个领域立稳脚跟。

       在此,先贴出建筑风格,摘自维基百科:http://zh.wikipedia.org/wiki/%E5%BB%BA%E7%AD%91%E9%A3%8E%E6%A0%BC

        







      

       高屋建瓴很重要,不仅要知其然还得知其所以然。

       单从编程语言入手,一张图就找到自己目前的位置,摘自维基百科:http://zh.wikipedia.org/wiki/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%AF%AD%E8%A8%80

     

     作为一个程序员,在面对代码时就没有理由说自己不会。

     先贴出一段代码:

template<typename T>
class WImage
{
public:
    typedef T BaseType;

    // WImage is an abstract class with no other virtual methods so make the
    // destructor virtual.
    virtual ~WImage() = 0;

    // Accessors
    IplImage* Ipl() {return image_; }
    const IplImage* Ipl() const {return image_; }
    T* ImageData() { return reinterpret_cast<T*>(image_->imageData); }
    const T* ImageData() const {
        return reinterpret_cast<const T*>(image_->imageData);
    }

    int Width() const {return image_->width; }
    int Height() const {return image_->height; }

    // WidthStep is the number of bytes to go to the pixel with the next y coord
    int WidthStep() const {return image_->widthStep; }

    int Channels() const {return image_->nChannels; }
    int ChannelSize() const {return sizeof(T); }  // number of bytes per channel

    // Number of bytes per pixel
    int PixelSize() const {return Channels() * ChannelSize(); }

    // Return depth type (e.g. IPL_DEPTH_8U, IPL_DEPTH_32F) which is the number
    // of bits per channel and with the signed bit set.
    // This is known at compile time using specializations.
    int Depth() const;

    inline const T* Row(int r) const {
        return reinterpret_cast<T*>(image_->imageData + r*image_->widthStep);
    }

    inline T* Row(int r) {
        return reinterpret_cast<T*>(image_->imageData + r*image_->widthStep);
    }

    // Pixel accessors which returns a pointer to the start of the channel
    inline T* operator() (int c, int r)  {
        return reinterpret_cast<T*>(image_->imageData + r*image_->widthStep) +
            c*Channels();
    }

    inline const T* operator() (int c, int r) const  {
        return reinterpret_cast<T*>(image_->imageData + r*image_->widthStep) +
            c*Channels();
    }

    // Copy the contents from another image which is just a convenience to cvCopy
    void CopyFrom(const WImage<T>& src) { cvCopy(src.Ipl(), image_); }

    // Set contents to zero which is just a convenient to cvSetZero
    void SetZero() { cvSetZero(image_); }

    // Construct a view into a region of this image
    WImageView<T> View(int c, int r, int width, int height);

protected:
    // Disallow copy and assignment
    WImage(const WImage&);
    void operator=(const WImage&);

    explicit WImage(IplImage* img) : image_(img) {
        assert(!img || img->depth == Depth());
    }

    void SetIpl(IplImage* image) {
        assert(!image || image->depth == Depth());
        image_ = image;
    }

    IplImage* image_;
};
源自opencv的  wimage.hpp文件部分源码。

    

function varargout = corner(varargin)
% CORNER Find corner points in an image.
%   CORNERS = CORNER(I) takes a grayscale or binary image I as its input
%   and returns CORNERS. The M-by-2 double matrix CORNERS  contains the X
%   and Y coordinates of the corner points detected in I.
%
%   CORNERS = CORNER(I,METHOD) detects corners in the grayscale or binary
%   image I using the specified METHOD.  Supported METHODs are:
%
%      'Harris'            : The Harris corner detector. This is the
%                                  default METHOD.
%      'MinimumEigenvalue' : Shi & Tomasi's minimum eigenvalue method.
%
%   CORNERS = CORNER(I,N) detects corners in the grayscale or binary
%   image I and returns a maximum of N corners. If N is not specified,
%   the default maximum number of corners returned is 200.
%
%   CORNERS = CORNER(I,METHOD,N) detects corners using the specified METHOD
%   and maximum number of corners.
%
%   CORNERS = CORNER(...,PARAM1,VAL1,PARAM2,VAL2,...) detects corners in I,
%   specifying parameters and corresponding values that control various
%   aspects of the corner detection algorithm.
%
%   Parameter options:
%   -------------------
%
%   'FilterCoefficients'     A vector, V, of filter coefficients for the
%                            separable smoothing filter. The full filter 
%                            kernel is given by the outer product, V*V'. 
%
%                            Default value: fspecial('gaussian',[5 1],1.5)
%
%   'QualityLevel'           A scalar Q, 0 < Q < 1, specifying the minimum 
%                            accepted quality of corners. The value of Q 
%                            is multiplied by the largest corner
%                            metric value. Candidate corners that have
%                            corner metric values less than the product are
%                            rejected. Larger values of Q can be used to
%                            remove erroneous corners.
% 
%                            Default value: 0.01
%
%   'SensitivityFactor'      A scalar K, 0 < K < 0.25, specifying the
%                            sensitivity factor used in the Harris
%                            detection algorithm. The smaller the value
%                            of K the more likely the algorithm is to
%                            detect sharp corners. This parameter is only
%                            valid with the 'Harris' method.
%
%                            Default value: 0.04
%
% Notes
% -----
% Non-maxima suppression is performed on candidate corners. Corners will be
% at least two pixels apart.
%
% Example
% -------
% Find and plot corner points in checkerboard image.
%
%        I = checkerboard(50,2,2);
%        corners = corner(I);
%        imshow(I);
%        hold on
%        plot(corners(:,1),corners(:,2),'r*');
%
% See also CORNERMETRIC

%   Copyright 2010 The MathWorks, Inc.
%   $Revision: 1.1.6.4 $  $Date: 2010/08/07 07:27:17 $

% parse inputs
[I,method,sensitivity_factor,...
    filter_coef,max_corners,quality_level] = parseInputs(varargin{:});

% Pass through parsed inputs to cornermetric. Only specify
% SensitivityFactor if Harris is the method. We've already verified in
% parseInputs that the user did not specify SensitivityFactor with a method
% other than Harris.
if strcmpi(method,'Harris');
    cMetric = cornermetric(I,...
        'Method',method,...
        'SensitivityFactor',sensitivity_factor,...
        'FilterCoefficients',filter_coef);
else
    cMetric = cornermetric(I,...
        'Method',method,...
        'FilterCoefficients',filter_coef);
end

% Use findpeak to do peak detection on output of cornermetric to find x/y
% locations of peaks.
[xpeak, ypeak] = findLocalPeak(cMetric,quality_level);

% Create vector of interest points from x/y peak locations.
corners = [xpeak, ypeak];

% Return N corners as specified by maxNumCorners optional input argument.
if max_corners < size(corners,1)
    corners = corners(1:max_corners,:); 
end

varargout{1} = corners;

%------------------------------------------------------------------
function BW = suppressLowCornerMetricMaxima(cMetric,BW,quality_level)

max_cmetric = max(cMetric(:));
if max_cmetric > 0
    min_metric = quality_level * max_cmetric;
else
    % Edge case: All corner metric values are 0 or less than zero. In this
    % case, mask all local maxima and return. This case arrises for uniform
    % input images.
    BW(:) = false;
    return
end

% Mask peak locations that are less than min_metric.
BW(cMetric < min_metric) = false;

%-------------------------------------------------------------------------
function [xpeak,ypeak] = findLocalPeak(cMetric,quality_level)

% The cornermetric matrix is all equal values for all input
% images with numRows/numCols <= 3. We require at least 4 rows
% and 4 colums to return a non-empty corner array.
[numRows,numCols] = size(cMetric);
if  ( (numRows < 4) || (numCols < 4))
    xpeak  = [];
    ypeak = [];
    return
end

% Find local maxima of corner metric matrix.
BW = imregionalmax(cMetric,8);

BW = suppressLowCornerMetricMaxima(cMetric,BW,quality_level);

% Suppress connected components which have same intensity and are part of
% one local maxima grouping. We want to 'thin' these local maxima to a
% single point using bwmorph.
BW = bwmorph(BW,'shrink',Inf);

% Return r/c locations that are valid non-thresholded corners. Return
% corners in order of decreasing corner metric value.
[r,c] = sortCornersByCornerMetric(BW,cMetric);

xpeak = c;
ypeak = r;

%-------------------------------------------------------------------------
function [r,c] = sortCornersByCornerMetric(BW,cMetric)

ind = find(BW);
[~,sorted_ind] = sort(cMetric(ind),'descend');
[r,c] = ind2sub(size(BW),ind(sorted_ind));

%-------------------------------------------------------------------------
function [I,method,sensitivity_factor,filter_coef,...
                  max_corners, quality_level] = parseInputs(varargin)
    
   % Reform varargin into consistent ordering: corner(I,METHOD,N) so that
   % we can use inputParser to do input parsing on optional args and P/V
   % pairs.
   if (nargin>1 && isnumeric(varargin{2}))
       if nargin>2
           %corner(I,N,P1,V1,...)
           varargin(4 : (nargin+1) ) = varargin(3:nargin);
       end
       
       %Now that any P/V have been handled, reorder 2nd and 3rd arguments
       %into the form:
       %corner(I,METHOD,N,...)
      varargin{3} = varargin{2};
      varargin{2} = 'Harris';
      
   end
       
parser = commonCornerInputParser(mfilename);
parser.addOptional('N',200,@checkMaxCorners);
parser.addParamValue('QualityLevel',0.01,@checkQualityLevel);

% parse input
parser.parse(varargin{:});

% assign outputs
I = parser.Results.Image;
method = parser.Results.Method;
sensitivity_factor = parser.Results.SensitivityFactor;
filter_coef = parser.Results.FilterCoefficients;
max_corners = parser.Results.N;
quality_level = parser.Results.QualityLevel;

% check for incompatible parameters.  if user has specified a sensitivity
% factor with method other than harris, we error.  We made the sensitivity
% factor default value a string to determine if one was specified or if the
% default was provided since we cannot get this information from the input
% parser object.
method_is_not_harris = ~strcmpi(method,'Harris');
sensitivity_factor_specified = ~ischar(sensitivity_factor);
if method_is_not_harris && sensitivity_factor_specified
    eid = sprintf('Images:%s:invalidParameterCombination',mfilename);
    error(eid,'%s',['The ''SensitivityFactor'' parameter is only '...
        'valid with the ''Harris'' method.']);
end

% convert from default strings to actual values.
if ischar(sensitivity_factor)
    sensitivity_factor = str2double(sensitivity_factor);
end

%-------------------------------
function tf = checkMaxCorners(x)
        
validateattributes(x,{'numeric'},{'nonempty','nonnan','real',...
            'scalar','integer','positive','nonzero'},mfilename,'N');
tf = true;

%-------------------------------
function tf = checkQualityLevel(x)
        
validateattributes(x,{'numeric'},{'nonempty','nonnan','real',...
            'scalar'},mfilename,'QualityLevel');
        
% The valid range is (0,1).        
if (x >=1) || (x <=0)
    error('Images:corner:invalidQualityLevel','The ''QualityLevel'' parameter must be in the range (0,1).');
end

tf = true;
以上是matlab安装目录的一个文件的源码。       

       

     当适应了一门语言的源码的风格后,理解和使用这门语言也就比较顺手了,个人的见解:

     对一门语言的掌握分为以下几个层次:

层次一:

     百度+书籍+sample

层次二:

     解读源码库

层次三:

     优化,重配置

层次四:

     神人空间

     

     如何形成自己的风格?

     首先必须要了解这个领域的历史,掌握或者熟悉几种或者最好大部分的风格,站在巨人的肩膀上才能看的更远。爱因斯坦的相对论提出也需要学习黎曼,高斯等一批前辈的成果,每一个成果都是在前人的基础上完成的。


     客观的看待风格,你可能喜欢一类风格,但是也不能贬低另一种风格,也许就是你鄙视的人在将来某一天限制你的发展,风格跟人一样。


     在实践中提高,形成一种风格,需要大量的实践,在实践中尽力的完善,在实践中坚持。


     

      


     


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值