機器視覺就是一門研究如何使機器「看」的學科(ps:大而空的話放到前面,來自維基百科)。
要理解前景檢測這個詞就需要從它的反義詞「背景」理解,背景很好理解,我站到乙個海藍色的牆前面,我的背景就是牆,也可以說是海藍色,那前景就是我了;前景檢測就是找到我和背景不一樣的地方。人一眼就可以看出來我站到牆前面,計算機可看不出來。
機器眼中 所以東西都是01010101010101010這種東西,哈哈。經過一系列封裝(如作業系統,檔案格式、c++類庫等等)最後可能我們可以在計算機內看到乙個矩陣,以三通道bgr為例可能如下表(ps我猜的):
0xff(b) 0xff(g) 0xff(r)
0xff(b) 0xff(g) 0xff(r)
0xff(b) 0xff(g) 0xff(r)
0xff(b) 0xff(g) 0xff(r)
0xff(b) 0xff(g) 0xff(r)
0xff(b) 0xff(g) 0xff(r)
0xff(b) 0xff(g) 0xff(r)
0xff(b) 0xff(g) 0xff(r)
0xff(b) 0xff(g) 0xff(r)
0xff(b) 0xff(g) 0xff(r)
0xff(b) 0xff(g) 0xff(r)
0xff(b) 0xff(g) 0xff(r)
0xff(b) 0xff(g) 0xff(r)
0xff(b) 0xff(g) 0xff(r)
0xff(b) 0xff(g) 0xff(r)
0xff(b) 0xff(g) 0xff(r)
4*4的畫素矩陣可能就是這樣子的啦,這裡也科普一下1920*1280就是有1920列1280行個這樣的畫素矩陣,計算機裡面是什麼樣子的呢?先將16進製制轉成2進製
11111111(b) 11111111(g) 11111111(r)
11111111(b) 11111111(g) 11111111(r)
11111111(b) 11111111(g) 11111111(r)
11111111(b) 11111111(g) 11111111(r)
11111111(b) 11111111(g) 11111111(r)
11111111(b) 11111111(g) 11111111(r)
11111111(b) 11111111(g) 11111111(r)
11111111(b) 11111111(g) 11111111(r)
11111111(b) 11111111(g) 11111111(r)
11111111(b) 11111111(g) 11111111(r)
11111111(b) 11111111(g) 11111111(r)
11111111(b) 11111111(g) 11111111(r)
11111111(b) 11111111(g) 11111111(r)
11111111(b) 11111111(g) 11111111(r)
11111111(b) 11111111(g) 11111111(r)
11111111(b) 11111111(g) 11111111(r)
假設我們的背景是白色的乙個區域,我們前景是乙個黑色到的點。那麼這個矩陣會是什麼樣子的呢?
11111111(b) 11111111(g) 11111111(r)
11111111(b) 11111111(g) 11111111(r)
11111111(b) 11111111(g) 11111111(r)
11111111(b) 11111111(g) 11111111(r)
11111111(b) 11111111(g) 11111111(r)
00000000(b) 00000000(g) 00000000(r)
11111111(b) 11111111(g) 11111111(r)
11111111(b) 11111111(g) 11111111(r)
11111111(b) 11111111(g) 11111111(r)
00000000(b) 00000000(g) 00000000(r)
11111111(b) 11111111(g) 11111111(r)
11111111(b) 11111111(g) 11111111(r)
11111111(b) 11111111(g) 11111111(r)
11111111(b) 11111111(g) 11111111(r)
11111111(b) 11111111(g) 11111111(r)
11111111(b) 11111111(g) 11111111(r)
如何從背景中找到黑色的點呢?可能說迴圈一下找到三個0x00就不是乙個黑點嗎?那如果這個矩陣背景不是全部是1呢?如果我們不知道前景是黑色呢?這裡就需要檢測出前景了。
如果背景是固定不變的,我們可以找到一張背景圖做樣本,如果背景會有變化,可以從碼流選擇乙個我們認為可行的背景,來作為樣本。例如後一幀和前一幀比較的前景是什麼?或者後30幀和前一幀比較前景是什麼。這樣我們就可以在動態的碼流中找到一些變化。
因為最近專案用到了,我就寫下來記錄一下過程,其中用到的類庫是opencv,程式語言則是c++。
cv::mat src1,src2; //假設這兩個是兩個合適時段的原
//我們要從這兩個原圖中找到前景
cv::mat dst1,dst2;
//首先做乙個灰度處理
cv::cvtcolor(src1,dst1,cv_bgr2gray);
cv::cvtcolor(src2,dst2,cv_bgr2gray);
//高斯濾波
cv::gaussianblur(dst1,dst1,cv::size(3,3),0);
cv::gaussianblur(dst2,dst2,cv::size(3,3),0);
//兩張圖做差
cv::mat diff_image;
cv::absdiff(dst1,dst2,diff_image);
//給幀差後的圖做乙個閾值限定,如下超過35閾值的即r+g+b>35的畫素改為255,其他改為0
//這一操作為最後乙個引數控制 cv::thresh_binart
cv::threshold(diff_image,diff_image,35,255,cv::thresh_binary);
//建立乙個28*28的核
cv::mat kernel = cv::getstructuringelement(cv::morph_ellipse,cv::size(28,28));
cv::erode(diff_image,diff_image,(3,3),cv::point(-1,-1),2); //腐蝕
cv::dilate(diff_image,diff_image,kernel,cv::pint(-1,-1),2); //膨脹
//將我們處理好的的邊界找到,會形成多個不規則的點集
std::vector> contours;
//其實這裡已經找到了前景的區域了,只需要你去區分一下這些點集圍成的區域哪個是前景。
//可以使用boundingrect來將點集使用乙個最小矩型來框出來
cv::rect rect = cv::boundingrect(contours[0]);
具體用什麼方式來處理這個就需要因地制宜來,上面流程也是我們專案的乙個小處理流程,當然為什麼要用高斯濾波不用其他的,為什麼要把腐蝕的核設為3*3,膨脹的核設為28*28,這個其實我也不知道。233333
下面說一下對於這個影象處理我自己的理解:
1、為什麼要做灰度處理,灰度首先比bgr少了很多資訊,運算速度就會快很多,而且灰度可以更專注於畫素間的梯度,也就是邊界等問題。
2、濾波:應該是讓畫素的特徵更為相近,這樣更好找出乙個合適的特徵,因為沒有做濾波可能畫面比較清晰,畫素的差異比較大,這樣很難找到規律吧。與之相反的操作應該就是銳化了。讓更具加有差異邊界更加清晰。
4、閾值化:做差之後相近的畫素相減幾乎就是很接近與零0,所以可以設立乙個閾值來將背景設定為0,把你感興趣的位置增大或者不變都可以。
5、腐蝕很膨脹,後面是先腐蝕後膨脹,原理大概是,腐蝕掉一些可以忽略的奇異點,然後再膨脹大將大面積且鄰近的區域連線起來,形成乙個區域。
6、最後就是把邊界畫出來,到這裡基本就找到了我們想要的前景,只需要將前景和一些不必要的區分開即可。
Halcon 機器視覺 發展前景
無意中看到了 halcon c 混合程式設計,奈何我不懂咋回事,只有先了解 halcon是什麼。想要學習 halcon機器視覺,當然幫你找了資源 論壇 視覺imax 感興趣的自行了解 用halcon五年回答一下 1.機器視覺好找也不好找工作,在北京 上海 深圳 尤其深圳人才奇缺。如果是一些二線城市崗...
機器視覺的發展前景 龍熙視覺
機器視覺的發展現狀和前景分析 機器視覺能夠帶來什麼?可以讓自動駕駛在道路上更安全的行駛,可以讓農作物能夠更健康的成長,可以讓機械人在我們的生活中充當好幫手。機器視覺在工業上應用領域廣闊,核心功能包括 測量 檢測 識別 定位等。其產業鏈可以分為上游部件級市場 中游系統整合和整機裝備市場和下游應用市場。...
晶圓缺陷檢測裝置 機器視覺檢測 視覺缺陷檢測裝置
機器視覺是一種裝備感測視覺儀器的檢測裝置,其中光學檢測儀器的比例很高,可用於檢測各種產品中的缺陷,判別和選擇物體,或丈量尺寸。應用於自動化生產線對物料進行校準定位。計算機視覺是最工業化的部分,首要用於工廠自動化測驗和機械人工業。機器視覺系統主要由三個部分組成的,輸出或顯示的影象採集,處理和分析影象。...