一个优秀的人都有一个良好的习惯以及一个优秀的习惯。
在建筑风格上,按照时代大致分为以下类型,而在程序设计的过程中,不同的程序员都有自己的风格,而熟悉的程序员的代码也会有熟悉的感觉,一个程序员的编程风格就跟一个建筑师的建筑风格一样重要,可以会很多建筑风格,但是必须擅长其中一二,不然就没有风格和资本在这个领域立稳脚跟。
在此,先贴出建筑风格,摘自维基百科: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
层次二:
解读源码库
层次三:
优化,重配置
层次四:
神人空间
如何形成自己的风格?
首先必须要了解这个领域的历史,掌握或者熟悉几种或者最好大部分的风格,站在巨人的肩膀上才能看的更远。爱因斯坦的相对论提出也需要学习黎曼,高斯等一批前辈的成果,每一个成果都是在前人的基础上完成的。
客观的看待风格,你可能喜欢一类风格,但是也不能贬低另一种风格,也许就是你鄙视的人在将来某一天限制你的发展,风格跟人一样。
在实践中提高,形成一种风格,需要大量的实践,在实践中尽力的完善,在实践中坚持。