現在又到了本科生畢業的時候,很多同學都在寫畢設了。想想去年幫我的女神做了
個物體識別,雖然沒用上,不過我覺得挺有意思的,放在硬碟裡睡覺也無啥價值,就發
表在這裡給學弟學妹們做做參考。
女神的畢設是城市交通管理,說白了就是設計一個交通燈,我覺得這有點侮辱我們
本科生智商,就自以為聰明的想做個道路車輛識別,通過網路攝影機得到當前道路的車輛數
量,然後再做別的處理。說白了就是數位影像處理。正好當時我們剛上完數位影像處理
這門課。就查點資料做做。
看看資料,要識別道路上的車輛,最簡單的方法就是用幀差法, 拿有物體的圖片減
去無物體的圖片,判斷有個變化就知道了。想想確實容易。先類比下,用相機拍了兩張
圖片,一個有物體,一個無物體,由於是幀差法,背景就無所謂了。
先是拍的兩張圖,注意拍的角度要一致。
無物體的圖片。
有物體的圖片
程式的目的就是識別出中間的百雀羚。
當然,首先轉為灰階圖片,在做差,取絕對值,舍掉差值小的地區,再膨脹腐蝕處理。就可以
得到只包含物體的圖了,得到它的長寬,標記處理,OK!
代碼如下,其實很短,更多的是顯示上了。
clear % 清空工作空間% clc % 清屏tic; % 開始計時wuc=imread('dscf0400.jpg'); % 讀取無物體彩色圖片wu=rgb2gray(wuc); % 轉換為灰階圖片youc=imread('dscf0401.jpg');% 讀取有物體彩色圖片you=rgb2gray(youc); % 轉換為灰階圖片%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 類型轉換,求差值wu=double(wu)/255;you=double(you)/255;d(:,:)=abs(you(:,:)-wu(:,:));% d=imabsdiff(you,wu);% d=double(d);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 二值化處理bw1=im2bw(d,0.2);% 膨脹腐蝕運算元,相當於閉操作se = strel('disk',3);bw=imerode(bw1,se);bw=imdilate(bw,se);% `尋找聯通地區[bwl,ln]=bwlabel(bw,4);% disp(ln); % 顯示聯通地區個數% 尋找最大聯通地區bwl_index=0;bwl_big=0;for m=1:ln tmp=sum(sum(bwl==m)); if(tmp>bwl_big) bwl_big=tmp; bwl_index=m; endend% 取最大聯通地區obj=(bwl==bwl_index);[c,r]=find(obj==1);xbegin=min(r);ybegin=min(c);xlength=max(r)-xbegin;ylength=max(c)-ybegin;% 繪圖im1=wuc; lab1='原圖';im2=youc; lab2='放入物品';% 對比增強後顯示im3=imadjust(d,[0,0.2],[0,1]);lab3='圖片差';im4=bw1; lab4='閾值處理';im5=bw; lab5='閉操作';im6=obj; lab6='識別';subplot(231);imshow(im1);title(lab1);subplot(232);imshow(im2);title(lab2);subplot(233);imshow(im3);title(lab3);subplot(234);imshow(im4);title(lab4);subplot(235);imshow(im5);title(lab5);subplot(236);imshow(im6);title(lab6);% 標記物品subplot(232);hold onplot(xbegin+xlength/2,ybegin+ylength/2,'*r');rectangle('Position',[xbegin,ybegin,xlength,ylength],'EdgeColor','g');hold offt=toc; % 計時結束fprintf('耗時:%g',t);
運行出的結果如。也可以自己重新拍照片,放進去,做自己的處理。我當時又做了網路攝影機的即時處理,等我的下篇部落格。
圖中第二張,一個綠色的矩形框就是識別出的物體位置及大小了。程式參考了各個地方的,只知其然不知其所以然。讓大方之家見笑了。