halcon opencv 图像处理面试指南
珠海某上市公司算法總監:
1、相機標定的原理與坐標系之間的轉換,如何轉換
2、激光三角原理,如何搭建
3、測量擬合的過程中有哪些算子,原理什么,接著問5,跌代多少次?什么情況最優,如何優化,
4、那個測量算子的優缺點?
5、如何最優的擬合圓
6、如何最優的擬合直線
7、除了標定halcon的標定方法還有哪些標定方法,分別是什么
8、相機坐標系之間是如何轉換的:
寧德新能源 二面(研發部門總監)
(選型)
1、做過那些方案?項目中你那個是全權完成的,碰到的什么問題?
2、對硬件了解多少?伺服電機選型如何選,光源如何選型?鏡頭如何選?對打光了解嗎?(完全蒙蔽)
3、機械設計有多少了解,多少要了解一些
(語言,問的少,但是問的很深)
1、c#和c++的區別是什么
2、什么是鎖,有那幾種鎖,如何解鎖,鎖和內存對應起來如何?
3、多肽是什么?舉例說明
4、多線程之間的交互方式有幾種,如何交互,各自的優缺點是什么
5、文件讀寫
(算法)
1、手眼標定手推一下,(我推完后),具體流程說一下,先后順序能不能亂?為什么
2、簡述base ?object ?tool ? camera的兩量關系,如果建立起來聯系
3、簡述決策樹,
4、一幅圖像中halcon 是如何存貯的,在opencv 中是如何存貯的?為什么要這樣存?
5、什么是最大似然估計
6、什么是圖像的矩,手推一下?
7、好像最近幾個問題感覺你沒有信心了?(我回答:不是,是在絕對的力量面前,嘶吼沒有任何意義,這次面試交流是對我自己的一個清晰定位,以后會怎么做更有方向)
8、三次內插法數學原理,簡單實現
9、halcon 模板匹配的原理,特征檢測的關鍵是什么,什么是特征檢測?
10、什么是滯后閾值處理,為什么這么做,用在那個方面
11、什么是極大值抑制,如何做極大值抑制,為什么要這么做?
12、c#中有沒有結構體
結構是值類型,它在棧中分配空間;而類是引用類型,它在堆中分配空間,棧中保存的只是引用。
結構和類的適用場合分析:
1、當堆棧的空間很有限,且有大量的邏輯對象時,創建類要比創建結構好一些;
2、對于點、矩形和顏色這樣的輕量對象,假如要聲明一個含有許多個顏色對象的數組,則CLR需要為每個對象分配內存,在這種情況下,使用結構的成本較低;
3、在表現抽象和多級別的對象層次時,類是最好的選擇,因為結構不支持繼承。
4、大多數情況下,目標類型只是含有一些數據,或者以數據為主。
13、c#的面向對象的特性
1.封裝
每個對象都包含它進行操作所需要的所有信息,封裝只公開代碼單元的對外接口,而隱藏其具體實現,盡量不對外公開代碼。使用封裝有很多好處,從設計角度來講,封裝可以對外屏蔽一些重要的信息,比如使用電腦的人只要知道怎么使用電腦就可以,不用知道這些功能具體是怎么實現的;從安全性考慮,封裝使對代碼的修改更加安全和容易,封裝明確的指出了哪些屬性和方法是外部可以訪問的,這樣當需要調整這個類的代碼時,只要保證公有屬性不變,公有方法的參數和返回值類型不變,那么就可以盡情的修改這個類,而不會影響到程序的其他部分;封裝還避免了命名沖突的問題,封裝有隔離作用,不同的類中可以有相同名稱的方法和屬性,但不會混淆,也可以減少耦合。
2.繼承
繼承可以使用現有類的所有功能,并在無須重新編寫原來的類的情況下,對這些功能進行擴展。使用繼承而產生的類被稱為派生類或子類,而被繼承的類則稱為基類或超類或父類。繼承表示一個類型派生于一個基類型,它擁有該基類型的所有成員字段和函數,其子類是對父類的擴展;接口繼承是表示一個類型只繼承了函數的簽名,沒有繼承任何實現代碼。繼承劃分了類的層次性,也可以說繼承是對類的分組,父類代表的是抽象的類,更常用的類,而子類代表的是更為具體,更為細化的類;繼承是實現代碼重用、擴展的重要手段。所謂抽象的類是指與具體的事項相聯系,但只是表達整體而不是具體概念的類,比如說形狀包含正方形、長方形、圓等,這時候形狀是一個抽象的概念,相當于一個父類,而正方形、長方形、圓是具體的形狀,相當于是子類。
3.多態
多態是指程序中同名的不同方法共存的情況,主要通過子類對父類方法的覆蓋來實現多態。這樣,不同類的對象可以用同名的方法完成特定的功能,但具體的實現方法卻可以不同。比如說形狀包含正方形、長方形、圓等,每個形狀都有面積和周長,但是不同的形狀計算面積和周長的方法都不同
14、c++ 和c# 的區別和聯系
?不同點:
1、c++中使用指針是非常重要的,c#中是沒有的
2、繼承問題,c++中可以多繼承,但是c#中是不能多繼承的,會造成歧義,通常用接口來代替多繼承
3、性能方面:C++普遍來說更快,c#相對來說就不那么好優化
4、內存回收:C++要求用戶手動處理內存,但是C#運行在虛擬機中,而虛擬機會自動處理內存。
5、C#是微軟研發的基于C特點的一門類似于Java的編程語言。其中C#有很多C語言的影子。C#是一門專注于windows平臺開發應用程序的語言,而C/C++是兼容windows和Linux平臺
6、C++可以創建獨立(stand-alone)和控制臺(console)程序。C#可以創建控制臺,Windows,ASP.NET和移動(mobile)程序,但不能創建獨立程序
15、c#可以不可多繼承,如何多繼承?
答案一:用接口啊,一個類可以繼承自多個接口的。
答案二:C#不支持多繼承,C++才支持多繼承,多繼承會讓代碼變得很亂,因此微軟在設計C#的時候放棄了多繼承。
碧桂園旗下-機器人公司二面:
1、介紹項目
2、模板匹配有幾種?
3、模板匹配除了灰度相關性的匹配外還有那種,如何來手寫一個模板匹配?
4、opencv 如何實現一維測量和二維測量
5、3D模板匹配
這家一面的問的算法的東西很多,面了大概1個小時,二面的話問的不多,在項目上問的比較細,也比較多。目前手里有兩個offer,心里就不慌了。
下面10道題是這位大神的總結的,其他的都是最近面試的時候問道的題目類型,記錄以做補充圖像處理-最常見面試題(必問)_聰哥965-CSDN博客_圖像處理面試題
1.圖像預處理有哪些方法?
? 1 平均濾波
? 2 中值濾波
? 3 高斯濾波
? ?4 高斯金字塔
? ?5 拉普拉斯濾波
? ?6 直方圖均衡化
1.1 高斯濾波器原理介紹?
Opencv 筆記3 圖像平滑_Σ?συφο?1900的博客-CSDN博客
高斯濾波對于抑制服從正態分布的噪聲效果非常好,其代價是使圖像變得“模糊”。
高斯濾波器最重要的參數就是高斯分布的標準差σ,σ越大,高斯濾波器的頻帶就較寬,對圖像的平滑程度就越好。通過調節σ參數,可以平衡對圖像的噪聲的抑制和對圖像的模糊。
高斯濾波的模板是用高斯公式計算出來的:
計算過程:
1.利用鄰域內其他像素點到鄰域中心的距離,帶入二維高斯函數,計算出高斯模板,常見3×3或5×5大小的高斯模板。
2.若模板為小數形式,進行歸一化處理,將模板左上角值歸一為1。
3.將高斯模板的中心對準待處理的圖像矩陣,然后對應元素相乘后相加,沒有元素的地方補零
(例如3×3高斯模板,需要對待處理圖像最外層補一圈零)。
4.每個元素分別進行上述計算,得到的輸出矩陣就是高斯濾波的結果。
2.圖像增強有哪些方法?
OPencv 圖像增強的案例_Σ?συφο?1900的博客-CSDN博客
1.對比度拉升:采用了線性函數對圖像的灰度值進行變換 2.Gamma校正:采用了非線性函數(指數函數)對圖像的灰度值進行變換 3.直方圖均衡化 將原始圖像的直方圖通過積分概率密度函數轉化為概率密度為1(理想情況)的圖像,從而達到提高對比度的作用。 直方圖均衡化的實質也是一種特定區域的展寬,但是會導致整個圖像向亮的區域變換。當原始圖像給定時,對應的直方圖均衡化的效果也相應的確定了。 4.直方圖規定化 5.同態濾波器https://blog.csdn.net/weixin_39354845/article/details/122903403
直方圖均衡化、Laplace、Log、Gamma
3.圖像的特征提取有哪些算法?
3.1 HOG(方向梯度直方圖)
?問題解析
HOG(Histogram of Oriented Gridients的簡寫)特征檢測算法,一種解決人體目標檢測的圖像描述子,是一種用于表征圖像局部梯度方向和梯度強度分布特性的描述符。其主要思想是:在邊緣具體位置未知的情況下,邊緣方向的分布也可以很好的表示行人目標的外形輪廓。
整體流程簡單描述如下:
1將輸入圖像(你要檢測的目標或者掃描窗口)灰度化,即將彩色圖轉換為灰度圖
2顏色空間歸一化:采用Gamma校正法對輸入圖像進行顏色空間的標準化(歸一化),目的是調節圖像的對比度,降低圖像局部的陰影和光照變化所造成的影響,同時可以抑制噪音的干擾
3梯度計算:計算圖像每個像素的梯度(包括大小和方向);主要是為了捕獲輪廓信息,同時進一步弱化光照的干擾
4梯度方向直方圖:將圖像劃分成小cells(例如8*8像素/cell), 統計每個cell的梯度直方圖(不同梯度的個數),即可形成每個cell的描述符
5重疊直方圖歸一化:將每幾個cell組成一個block(例如3*3個cell/block),一個block內所有cell的特征descriptor串聯起來便得到該block的HOG特征描述符。
6HOG特征:將圖像image內的所有block的HOG特征描述符串聯起來就可以得到該image(你要檢測的目標)的HOG特征描述符,就得到最終的可供分類使用的特征向量了
答案
HOG的主要思想是:在一副圖像中,局部目標的表象和形狀(appearance and shape)能夠被梯度或邊緣的方向密度分布(即梯度的統計信息,而梯度主要位于邊緣的地方)很好地描述。HOG特征檢測算法的幾個步驟:
顏色空間歸一化
梯度計算
梯度方向直方圖
重疊塊直方圖歸一化
HOG特征
8常用的圖像局部特征和全局特征
常用的全局特征就是顏色,紋理,形狀,直方圖等,局部特征有關鍵點,角點等
?
3.2 SIFT(尺度不變特征變換)
SIFT:opencv 特征提取 -SIFT_Σ?συφο?1900的博客-CSDN博客
主要步驟
1)、尺度空間的生成;
? ? 2)、檢測尺度空間極值點;
3)、精確定位極值點,消除邊緣響應,并剔除對比度低的點;
4)、為每個關鍵點指定方向參數;
5)、關鍵點描述子的生成。
3.3 SURF(加速穩健特征,對sift的改進)
3.4 DOG(高斯函數差分)
為了在尺度空間中找到穩定不變的極值點,在SIFT算法中使用了高斯差分(DOG)函數D(x,y,σ),定義為
其中?kσ和?σ是連續的兩個圖像的平滑尺度,所得到的差分圖像再高斯差分金字塔中。?
選擇高斯差分函數的原因如下:
1. 計算簡單,因為 L(x,y,σ)L(x,y,σ)是一定需要計算的,而D(x,y,σ)只需要執行減法。
2. 高斯拉普拉斯算子LoG(Laplacian of Gaussian),即圖像的二階導數,能夠在不同的尺度下檢測到圖像的斑點特征,從而檢測到圖像中尺度變化下的位置不動點,但是LoG的運算效率不高。而DoG是LoG的近似。DoG和LoG的關系如下述所示:
?而 σ2?2G正是尺度歸一化算子的表達形式。在所有的尺度中 k-1是一個常數,當 kk趨近于1的時候誤差趨近于0,但實際上這種誤差對于極值的位置檢測并沒有什么影響
3. 通過前人的實驗證明LoG提取的特征穩定性最強
?
3.5 LBP(局部二值模式)
3.6 HAAR
? ? ? ? ?Haar特征分為三類:邊緣特征、線性特征、中心特征和對角線特征,組合成特征模板。特征模板內有白色和黑色兩種矩形,并定義該模板的特征值為白色矩形像素之和減去黑色矩形像素之和。Haar特征值反映了圖像的灰度變化情況。 如:眼睛要比臉頰顏色要深,鼻梁兩側比鼻梁顏色要深,嘴巴比周圍顏色要深等。
在不同的尺度空間上查找關鍵點(特征點),并計算出關鍵點的方向。SIFT所查找到的關鍵點是一些十分突出、不會因光照、仿射變換和噪音等因素而變化的點,如角點、邊緣點、暗區的亮點及亮區的暗點等。
3.7 SIFT vs HOG
共同點:都是基于圖像中梯度方向直方圖的特征提取方法
不同點:
SIFT提取的關鍵點是角點(是角點+梯度直方圖),HOG提取的是邊緣特征。
SIFT 特征通常與使用SIFT檢測器得到的興趣點一起使用。這些興趣點與一個特定的方向和尺度相關聯。通常是在對一個圖像中的方形區域通過相應的方向和尺度變換后,再計算該區域的SIFT特征。
結合SIFT和HOG方法,可以發現SIFT對于復雜環境下物體的特征提取具有良好的特性;而HOG對于剛性物體的特征提取具有良好的特性。
4.膨脹和腐蝕含義?開運算和閉運算先后順序?
Opencv 筆記1 膨脹、腐蝕、morphologyEx、開、閉操作_Σ?συφο?1900的博客-CSDN博客
? ? 膨脹:指使用卷積核B(可以理解為模板)對圖像A(或者某部分區域)進行卷積操作,卷積核可以是任意形狀或大小。膨脹是求局部最大值的操作。
當卷積核B(模板)掃描圖像A與其進行卷積操作時,計算模板B覆蓋的區域的最大值并將最大值賦給模板的參考點。因為圖像中亮點的灰度值大,所以膨脹操作會使得圖像中的高亮區域逐漸增長。
?
腐蝕:是膨脹的反操作,腐蝕計算的是局部區域的最小值。將卷積核B與圖像A進行卷積,將B所覆蓋區域的最小值賦給參考點。腐蝕操作會使得圖像中亮的區域變小,暗的區域變大。
?
1)開運算:先對圖像腐蝕后膨脹。
A○S= (AΘS)⊕ S
作用:用來消除小的物體,平滑形狀邊界,并且不改變其面積。可以去除小顆粒噪聲,斷開物體之間的粘連。
2)閉運算:先對圖像膨脹后腐蝕
A●S= (A⊕S)Θ S
作用:用來填充物體內的小空洞,連接鄰近的物體,連接斷開的輪廓線,平滑其邊界的同時不改變面積。
開操作
● 開操作是指:先腐蝕,在膨脹。
● 開操作可以移除較小的明亮區域、在較細的地方分離物體。
● 應用例子:通過開操作將閾值處理后的細胞分離,可以更清晰地統計細胞數目
?
閉操作
● 閉操作是指:先膨脹,再腐蝕。
● 閉操作可以填充物體內的細小空洞、連接鄰近的明亮物體。
5.傳統的邊緣檢測算子有哪些?
Opencv 筆記5 邊緣處理-canny、sobel、Laplacian、Prewitt_Σ?συφο?1900的博客-CSDN博客
? ? ?5.1 索貝爾算子(Sobel)
是以離散型的差分算子,用來運算圖像亮度函數的梯度的近似值, Sobel算子是典型的基于一階導數的邊緣檢測算子,由于該算子中引入了類似局部平均的運算,因此對噪聲具有平滑作用,能很好的消除噪聲的影響。Sobel算子對于像素的位置的影響做了加權,與Prewitt算子、Roberts算子相比因此效果更好。
Sobel算子包含兩組3x3的矩陣,分別為橫向及縱向模板,將之與圖像作平面卷積,即可分別得出橫向及縱向的亮度差分近似值。實際使用中,常用如下兩個模板來檢測圖像邊緣。
?
然后可用以下公式計算梯度方向。
若Θ = 0,即代表圖像該處擁有縱向邊緣,左方較右方暗
缺點:Sobel并沒有將圖像的主題與背景嚴格地區分開來,也就是沒有基于圖像灰度進行處理;由于沒有嚴格地模擬人的視覺生理特征,所以提取的圖像輪廓有時并不能令人滿意。
5.2 加權平均算子(Isotropic Sobel)
權值反比于鄰點與中心點的距離,當沿不同方向檢測邊緣時梯度幅度一致,就是通常所說的各向同性Sobel(Isotropic Sobel)算子。模板也有兩個,一個是檢測水平邊沿的 ,另一個是檢測垂直平邊沿的 。各向同性Sobel算子和普通Sobel算子相比,它的位置加權系數更為準確,在檢測不同方向的邊沿時梯度的幅度一致。
5.3 羅伯茨算子(Roberts)
是一種最簡單的算子,是一種利用局部差分算子尋找邊緣的算子,他采用對角線方向相鄰兩象素之差近似梯度幅值檢測邊緣。檢測垂直邊緣的效果好于斜向邊緣,定位精度高,對噪聲敏感,無法抑制噪聲的影響。
Roberts邊緣算子是一個2x2的模板,采用的是對角方向相鄰的兩個像素之差。
5.4 Prewitt算子
是一種一階微分算子的邊緣檢測,利用像素點上下、左右鄰點的灰度差,在邊緣處達到極值檢測邊緣,去掉部分偽邊緣,對噪聲具有平滑作用 。其原理是在圖像空間利用兩個方向模板與圖像進行鄰域卷積來完成的,這兩個方向模板一個檢測水平邊緣,一個檢測垂直邊緣
5.5 拉普拉斯算子(Laplacian)
是一種各向同性算子,二階微分算子,在只關心邊緣的位置而不考慮其周圍的象素灰度差值時比較合適。Laplace算子對孤立象素的響應要比對邊緣或線的響應要更強烈,因此只適用于無噪聲圖象。存在噪聲情況下,使用Laplacian算子檢測邊緣之前需要先進行低通濾波。所以,通常的分割算法都是把Laplacian算子和平滑算子結合起來生成一個新的模板。
一個二維圖像函數的拉普拉斯變換是各向同性的二階導數,定義了更適合于數字圖像處理,將拉式算子表示為離散形式:
兩步
?? ?1)先cv.Laplacian(image, cv.CV_16S, ksize=3)
?? ?2)再 cv.convertScaleAbs(Laplacian) 即可
5.6 Canny算子
Sobel算子檢測方法對灰度漸變和噪聲較多的圖像處理效果較好,sobel算子對邊緣定位不是很準確,圖像的邊緣不止一個像素;當對精度要求不是很高時,是一種較為常用的邊緣檢測方法。? ??
Canny方法不容易受噪聲干擾,能夠檢測到真正的弱邊緣。優點在于,使用兩種不同的閾值分別檢測強邊緣和弱邊緣,并且當弱邊緣和強邊緣相連時,才將弱邊緣包含在輸出圖像中。
Laplacian算子法對噪聲比較敏感,所以很少用該算子檢測邊緣,而是用來判斷邊緣像素視為與圖像的明區還是暗區。拉普拉斯高斯算子是一種二階導數算子,將在邊緣處產生一個陡峭的零交叉, Laplacian算子是各向同性的,能對任何走向的界線和線條進行銳化,無方向性。這是拉普拉斯算子區別于其他算法的最大優點。
https://www.jianshu.com/p/2a06c68f6c14
?
優于前面幾種算法,實現麻煩,是一個具有濾波,增強,檢測的多階段的優化算子,在進行處理前,Canny算子先利用高斯平滑濾波器來平滑圖像以除去噪聲,Canny分割算法采用一階偏導的有限差分來計算梯度幅值和方向,在處理過程中,Canny算子還將經過一個非極大值抑制的過程,最后Canny算子還采用兩個閾值來連接邊緣。
step1: 用高斯濾波器平滑圖像;
step2: 用一階偏導的有限差分來計算梯度的幅值和方向;
step3: 對梯度幅值進行非極大值抑制
step4: 用雙閾值算法檢測和連接邊緣(雙閾值篩選)
5.6.1 Canny如何極大值抑制?
通常灰度變化的地方都比較集中,將局部范圍內的梯度方向上,灰度變化最大的保留下來,其它的不保留,這樣可以剔除掉一大部分的點。將有多個像素寬的邊緣變成一個單像素寬的邊緣。即“胖邊緣”變成“瘦邊緣”。
Canny算子中的非極大值抑制是沿著梯度方向進行的,即是否為梯度方向上的極值點;而在角點檢測等場景下說的非極大值抑制,則是檢測中心點處的值是否是某一個鄰域內的最大值,是,則保留,否則去除,這種情況下的非極大值抑制比較簡單。
6.直方圖是什么?
是用以表示數字圖像中亮度分布的直方圖,標繪了圖像中每個亮度值的像素數;橫坐標的左側為純黑、較暗的區域,而右側為較亮、純白的區域。
7.直方圖的均衡化
目的:將原始圖像的灰度級均勻的映射到整個灰度級范圍內,得到一個灰度級均勻的圖像。
實現方法:將該灰度級出來的概率累計之前灰度級的概率之和,然后乘以最大灰度值,所得即為均衡化圖像。
8.如何對圖像進行90度旋轉?
opencv 圖像旋轉_Σ?συφο?1900的博客-CSDN博客
img = cv2.imread("./data/hig.jpg")
out=cv2.transpose(img)
out=cv2.flip(out,flipCode=0) ?# 0:左旋轉 | 1:右旋轉
9.數據增強怎么處理的?
9.1 幾何變換
flip:水平翻轉,也叫鏡像;垂直翻轉
rotation:圖片旋轉一定的角度,這個可以通過opencv來操作,各個框架也有自己的算子
crop:隨機裁剪,比如說,在ImageNet中可以將輸入圖片進行裁剪,然后輸入。
9.2 顏色變換
hue:灰度調節
contrast:在圖像的HSV顏色空間,改變H,S和V亮度分量,增加光照變化。對光照有特殊要求的可以使用
saturation:圖像飽和度 exposure:增加曝光
9.3 多個區域置零
random erase:隨機擦除,將圖片中的某個區域置零
CutOut:和random erase 差不多,都是將圖片中某個區域擦除
hide-and-seek:將圖片分為k*k的網格,每個網格已一定概率的方式擦除,和random erase、CutOut差不多。
grid mask:首先準備一個mask,mask非零即一,將mask和圖片相乘,這樣就會擦除很多區域了。
9.4 多張圖片增強
MixUp:兩張圖片,經過對應位置,經過線性插值,組成一張新的照片
CutMix:就是將一部分區域cut掉但不填充0像素而是隨機填充訓練集中的其他數據的區域像素值,分類結果按一定的比例分配。
圖像旋轉之后的空洞怎么補齊? 最鄰近插值,雙線性插值
10.圖像處理基本算法
圖像平滑?Opencv 筆記3 圖像平滑_Σ?συφο?1900的博客-CSDN博客
圖像濾波算法?
模型匹配
Blob分析:【數字圖像處理學習筆記之三】Blob分析_zhougynui的博客-CSDN博客_機器視覺blob分析原理
?Blob分析的一般步驟:
(1)圖像分割:分離出前景和背景
(2)連通性分析:根據目標的連通性對目標區域進行標記,或者叫拓撲性分析
(3)特征量計算:描述了區域的幾何特征,這些幾何特征不依賴與灰度值
? ? ? ? 一個很簡單的例子:
? ? ? ? ?1.圖像分割
? ? ? ? ? ? ?將圖像分離為目標像素和背景像素,初始分割之后一般需要進行形態學處理才能滿足使用要求。常用分割方法:直接輸入;硬閾值分割;軟閾值分割。常用形態學處理包括:連通、膨脹、腐蝕、開操作、閉操作、頂帽變換、擊中與不擊中變換、交集、差異、骨架、邊界等。
閾值分割又包括:
1)簡單閾值分割threshold
適用范圍:目標與背景之間存在灰度差(如果環境穩定,閾值可以在離線狀態下一次確定)
2)動態閾值分割dyn_threshold
適用范圍:背景不均一無法確定全局閾值、目標經常表現為比背景局部亮一些或者暗一些。這時候需要通過其領域來找到一個合適的閾值進行分割。確定其領域的方法是:通過一些平滑濾波算子來確定領域,例如mean_image或者binomial_filter
3)自動全局閾值方法bin_threshold
4)watersheds_threshold
? ?2.特征量計算常用
area_center,區域面積Area和中心(Row,Column)
area_center_gray,區域面積Area和灰度中心(Row,Column)
smallest_rectangle1最小外接矩形
smallest_rectangle2最小外接仿射矩形,
compactness,緊湊度
elliptic_axis,計算region區域中的橢圓參數
intensity,計算region區域的灰度平均值和偏差
min_max_gray,最小最大灰度值
11、opencv中RGB2GRAY是怎么實現的
答:以R、G、B為軸建立空間直角坐標系,則RGB圖的每個象素的顏色可以用該三維空間的一個點來表示,而Gray圖的每個象素的顏色可以用直線R=G=B上的一個點來表示。于是rgb轉gray圖的本質就是尋找一個三維空間到一維空間的映射,最容易想到的就是射影(即過rgb空間的一個點向直線R=G=B做垂線),事實上Matlab也是這樣做的,輸出的灰度圖像是RGB三種顏色通道的加權和;
Gray = 0.29900 * R + 0.58700 * G + 0.11400 * B。
灰度可以說是亮度(luminance)的量化值,而RGB的定義是客觀的三個波長值,轉換時需要考慮人眼對不同波長的靈敏度曲線,所以系數不相等。
目前通過卷積神經網絡進行檢測的方法主要分為one-stage和two-stage,分別寫出了解的對應的算法。
12、數字圖像中有哪些基本特征?
答:顏色特征、紋理特征、形狀特征、空間關系特征等。
13、霍夫變換的理解
? ? ?霍夫變換常用來提取圖像中的直線和圓等幾何形狀。它通過一種投票算法檢測具有特定形狀的物體。該過程在一個參數空間中通過計算累計結果的局部最大值得到一個符合該特定形狀的集合作為霍夫變換結果。
答案
針對每個像素點,使得theta從-90度到180度,使用極坐標p = xcos(theta) + ysin(theta) 計算得到共270組(p,theta)代表著霍夫空間的270條直線。將這270組值存儲到H中。
如果一組點共線,則這組點中的每個值,都會使得H(p,theta)加1。
因此找到H(p,theta)值最大的直線,就是共線的點最多的直線,H(p,theta)值次大的,是共線點次多的直線。可以根據一定的閾值,將比較明顯的線全部找出來
?
14、圖像的插值方法有哪些?
最近鄰法
雙線性內插法
三次內插法
https://blog.csdn.net/weixin_39354845/article/details/122949415
15、Graph-cut的基本原理和應用
GraphCut方法圖像分割問題與圖的最小割(min cut)問題相關聯。
首先用一個無向圖G=表示要分割的圖像,V和E分別是頂點(vertex)和邊(edge)的集合。此處的Graph和普通的Graph稍有不同。普通的圖由頂點和邊構成,如果邊的有方向的,這樣的圖被則稱為有向圖,否則為無向圖,且邊是有權值的,不同的邊可以有不同的權值,分別代表不同的物理意義。而Graph Cuts圖是在普通圖的基礎上多了2個頂點,這2個頂點分別用符號”S”和”T”表示,統稱為終端頂點。其它所有的頂點都必須和這2個頂點相連形成邊集合中的一部分。
答案
根據待分割的圖像,確定圖的節點與邊,即圖的形狀已確定下來,是給圖中所有邊賦值相應的權值,然后找到權值和最小的邊的組合,就完成了圖像分割。
16、圖像銳化 – sharpen
圖像銳化,是使圖像邊緣更清晰的一種圖像處理方法,細節增強(detail enhancement)我理解也包含了圖像銳化,常用的做法是提取圖像的高頻分量,將其疊加到原圖上。圖像高頻分量的提取有兩種做法,一種是用高通濾波器,得到高頻分量,另一種是通過低通濾波,用原圖減低頻得以高頻。
直接提取高頻的方法有sobel算法和laplcian算子。sobel算子是圖像的一階導數,提取的是梯度信息,分水平和垂直兩種,常常用來做邊緣檢測、方向判別,sobel算子在斜坡處不為0,因此會產生較粗的邊緣。laplcian算子是圖像的二階導,在圖像開始變化和結束變化的地方值不為0,漸變時結果為0,因此laplacian比sobel算子更適合做sharpen。
除了直接提取高頻的方法外,我們也可以先提取低頻,原圖減去低頻得到高頻。這種方法稱為非銳化掩模(unsharpen mask),我們常使用低通濾波器(高斯、雙邊)對圖像進行濾波,這種方法濾波器很好控制(包括大小和強弱),從而可以控制高頻分量的強弱。
平滑:把圖像變模糊
銳化:把圖像變清晰
圖像銳化主要用于增強圖像的灰度跳變部分,這一點與圖像平滑對灰度跳變的抑制正好相反,事實上從平滑與銳化的兩種運算算子上也能說明這一點,線性平滑都是基于對圖像鄰域的加權求和或積分運算,而銳化則通過其逆運算導數(梯度)或有限差分來實現。
17、SIFT、HOG。SIFT是如何保持尺度不變性的
對SIFT算法的理解,尤其是尺度不變性_ChuanjieZhu-CSDN博客_尺度不變性
18、常用的圖像分割算法。
19、寫一個圖像resize函數(放大和縮小)
20、寫梯度下降代碼
21、opencv里面mat有哪些構造函數
淺談Opencv Mat類(常用構造函數和成員函數整理)_古天九等一縷的博客-CSDN博客_opencv構造mat
Mat::Mat()
無參數構造方法;
2、Mat::Mat(int rows, int cols, int type)
創建行數為 rows,列數為 col,類型為 type 的圖像;
3、Mat::Mat(Size size, int type)
創建大小為 size,類型為 type 的圖像;
4、Mat::Mat(int rows, int cols, int type, const Scalar& s)
創建行數為 rows,列數為 col,類型為 type 的圖像,并將所有元素初始化為值 s;
5、Mat::Mat(Size size, int type, const Scalar& s)
創建大小為 size,類型為 type 的圖像,并將所有元素初始化為值 s;
6、Mat::Mat(const Mat& m)
將m賦值給新創建的對象,此處不會對圖像數據進行復制,m和新對象共用圖像數據,屬于淺拷貝;
7、Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)
創建行數為rows,列數為col,類型為type的圖像,此構造函數不創建圖像數據所需內存,而是直接使用data所指內存,圖像的行步長由 step指定。
8、Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP)
創建大小為size,類型為type的圖像,此構造函數不創建圖像數據所需內存,而是直接使用data所指內存,圖像的行步長由step指定。
9、Mat::Mat(const Mat& m, const Range& rowRange, const Range& colRange)
創建的新圖像為m的一部分,具體的范圍由rowRange和colRange指定,此構造函數也不進行圖像數據的復制操作,新圖像與m共用圖像數據;
10、Mat::Mat(const Mat& m, const Rect& roi)
?
22、如何將buffer類型轉化為mat類型?
23、opencv如何讀取png格式的圖片?
img = cv2.imread(filepath, cv2.IMREAD_UNCHANGED)
24、opencv如何讀取內存圖片?
OpenCV 讀取內存圖片_m0_37346206的博客-CSDN博客_opencv讀取內存圖片
opencv 3:?
char * lpFileBuf = GetFileBuf("girl.bmp");CvMat mCvmat = cvMat(512*3, 768*3, CV_8UC1, lpFileBuf); IplImage*IpImg = cvDecodeImage(&mCvmat, 1);//opencv 2.0 CvMat->Mat數據轉換 //Mat b = Mat(mat,true); //opencv3.0 CvMat->Mat數據轉換 //Mat image = cvarrToMat(pp);Mat image = cvarrToMat(IpImg).clone(); cvReleaseImage(&IpImg);opencv 4:
#include <opencv2/opencv.hpp> cv::_InputArray pic_arr(bmpFileBuf, nBmpBufSize); cv::Mat src_mat = cv::imdecode(pic_arr, cv::IMREAD_UNCHANGED); cv::imshow("123", src_mat);
opencv從內存中讀取圖片可以大大減少讀取文件所消耗的時間。
CvMat中的data數據只是矩陣數據的首地址,分配的內存大小為行列乘積。對該內存塊的操作需要調用函數,也可以使用指針索引。
找到了 opencv加載內存中的圖片數據的方法,現在記錄下來。
//參數分別為 圖片寬度,高度,類型,圖片數據指針(unsigned char*)
//這個構造函數并沒有從新分配內存
?
25、opencv里面有哪些庫?
我們都知道 OpenCV 是一個開源的計算機視覺庫,那么里面到底有哪些東西?本文將為你解答這個問題。
模塊一:CV
這個模塊是?OpenCV 的核心,它包含了基本的圖像處理函數和高級的計算機視覺算法。
模塊二:HighGUI
這個模塊包含了圖像和視頻的基本 GUI 輸入輸出函數。
模塊三:MILL
這個模塊是計算機學習庫,包含一些基于統計的分類和聚類工具。
模塊四:CXCORE
這個模塊包含了基本數據結構和一些最基本的函數。上面四個模塊都要調用此模塊。
下圖可形象表述OpenCV的四大模塊
【calib3d】:其實就是就是Calibration(校準)加3D這兩個詞的組合縮寫。這個模塊主要是相機校準和三維重建相關的內容。基本的多視角幾何算法,單個立體攝像頭標定,物體姿態估計,立體相似性算法,3D信息的重建等等。【contrib】:也就是Contributed/Experimental Stuf的縮寫, 該模塊包含了一些最近添加的不太穩定的可選功能,不用去多管。2.4.8之后有新型人臉識別, 立體匹配 ,人工視網膜模型等技術。【core】: 核心功能模塊,尤其是底層數據結構和算法函數。包含如下內容:OpenCV基本數據結構 動態數據結構 繪圖函數 數組操作相關函數 輔助功能與系統函數和宏 【imgproc】: Image和Processing這兩個單詞的縮寫組合。圖像處理模塊,這個模塊包含了如下內容:線性和非線性的圖像濾波 圖像的幾何變換 其它(Miscellaneous)圖像轉換 直方圖相關 結構分析和形狀描述 運動分析和對象跟蹤 特征檢測 【features2】: d也就是Features2D, 2D功能框架 ,包含興趣點檢測子、描述子以及興趣點匹配框架。包含如下內容:特征檢測和描述 特征檢測器(Feature Detectors)通用接口 描述符提取器(Descriptor Extractors)通用接口 描述符匹配器(Descriptor Matchers)通用接口 通用描述符(Generic Descriptor)匹配器通用接口 【flann】: Fast Library for Approximate Nearest Neighbors,高維的近似近鄰快速搜索算法庫, 包含兩個部分:快速近似最近鄰搜索和聚類。【gpu】: 運用GPU加速的計算機視覺模塊。【highgui】: 也就是high gui,高層GUI圖形用戶界面,包含媒體的I / O輸入輸出, 視頻捕捉、圖像和視頻的編碼解碼、圖形交互界面的接口等內容。【legacy】: 一些已經廢棄的代碼庫,保留下來作為向下兼容,包含如下相關的內容。運動分析 期望最大化 直方圖 平面細分(C API) 特征檢測和描述(Feature Detection and Description) 描述符提取器(Descriptor Extractors)的通用接口 通用描述符(Generic Descriptor Matchers)的常用接口 【ml】: Machine Learning,機器學習模塊, 基本上是統計模型和分類算法,包含如下內容。統計模型 (Statistical Models) 一般貝葉斯分類器 (Normal Bayes Classifier) K-近鄰 (K-NearestNeighbors) 支持向量機 (Support Vector Machines) 決策樹 (Decision Trees) 提升(Boosting) 梯度提高樹(Gradient Boosted Trees) 隨機樹 (Random Trees) 超隨機樹 (Extremely randomized trees) 期望最大化 (Expectation Maximization) 神經網絡 (Neural Networks) MLData 【nonfree】: 也就是一些具有專利的算法模塊 ,包含特征檢測和GPU相關的內容。最好不要商用,可能會被告哦。【objdetect】: 目標檢測模塊,包含Cascade Classification(級聯分類)和Latent SVM這兩個部分。【ocl】: 即OpenCL-accelerated Computer Vision,運用OpenCL加速的計算機視覺組件模塊。【photo】: 也就是Computational Photography,包含圖像修復和圖像去噪兩部分。【stitching】: images stitching,圖像拼接模塊,包含如下部分。拼接流水線 特點尋找和匹配圖像 估計旋轉 自動校準 圖片歪斜 接縫估測 曝光補償 圖片混合 【superres】: SuperResolution,超分辨率技術的相關功能模塊。【ts】: opencv測試相關代碼,不用去管他。【video】: 視頻分析組件,該模塊包括運動估計,背景分離,對象跟蹤等視頻處理相關內容。【Videostab】: Video stabilization,視頻穩定相關的組件
26、用過opencv里面哪些函數?
opencv 圖像處理函數大全_m0_37964922的博客-CSDN博客_opencv圖像處理函數
? LoadImage:將圖像文件加載至內存; NamedWindow:在屏幕上創建一個窗口; ShowImage:在一個已創建好的窗口中顯示圖像; WaitKey:使程序暫停,等待用戶觸發一個按鍵操作; ReleaseImage:釋放圖像文件所分配的內存; DestroyWindow:銷毀顯示圖像文件的窗口; CreateFileCapture:通過參數設置確定要讀入的AVI文件; QueryFrame:用來將下一幀視頻文件載入內存; ReleaseCapture:釋放 Capture結構開辟的內存空間; CreateTrackbar:創建一個滾動條; SetCaptureProperty:設置 Capture對象的各種屬性; GetCaptureProperty:查詢 Capture對象的各種屬性; GetSize:當前圖像結構的大小; Smooth:對圖像進行平滑處理; PyrDown:圖像金字塔,降采樣,圖像縮小為原來四分之一; Canny:Canny邊緣檢測; CreateCameraCapture:從攝像設備中讀入數據; CreateVideoWriter:創建一個寫入設備以便逐幀將視頻流寫入視頻文件; WriteFrame:逐幀將視頻流寫入文件; ReleaseVideoWriter:釋放 VideoWriter結構開辟的內存空間; _MAT_ELEM:從矩陣中得到一個元素; Abs:計算數組中所有元素的絕對值; AbsDiff:計算兩個數組差值的絕對值; AbsDiffS:計算數組和標量差值的絕對值; Add:兩個數組的元素級的加運算; AddS:一個數組和一個標量的元素級的相加運算; AddWeighted:兩個數組的元素級的加權相加運算(alpha運算); Avg:計算數組中所有元素的平均值; AvgSdv:計算數組中所有元素的絕對值和標準差; CalcCovarMatrix:計算一組n維空間向量的協方差; Cmp:對兩個數組中的所有元素運用設置的比較操作; CmpS:對數組和標量運用設置的比較操作; ConvertScale:用可選的縮放值轉換數組元素類型; Copy:把數組中的值復制到另一個數組中; CountNonZero:計算數組中非0值的個數; CrossProduct:計算兩個三維向量的向量積(叉積); tColor:將數組的通道從一個顏色空間轉換另外一個顏色空間; Det:計算方陣的行列式; Div:用另外一個數組對一個數組進行元素級的除法運算; DotProduct:計算兩個向量的點積; EigenVV:計算方陣的特征值和特征向量; Flip:圍繞選定軸翻轉; GEMM:矩陣乘法; GetCol:從一個數組的列中復制元素; GetCols:從數據的相鄰的多列中復制元素; GetDiag:復制數組中對角線上的所有元素; GetDims:返回數組的維數; GetDimSize:返回一個數組的所有維的大小; GetRow:從一個數組的行中復制元素值; GetRows:從一個數組的多個相鄰的行中復制元素值; GetSize:得到二維的數組的尺寸,以 Size返回; GetSubRect:從一個數組的子區域復制元素值; InRange:檢查一個數組的元素是否在另外兩個數組中的值的范圍內; InRangeS:檢查一個數組的元素的值是否在另外兩個標量的范圍內; Invert:求矩陣的逆; Mahalonobis:計算兩個向量間的馬氏距離; Max:在兩個數組中進行元素級的取最大值操作; MaxS:在一個數組和一個標量中進行元素級的取最大值操作; Merge:把幾個單通道圖像合并為一個多通道圖像; Min:在兩個數組中進行元素級的取最小值操作; MinS:在一個數組和一個標量中進行元素級的取最小值操作; MinMaxLoc:尋找數組中的最大最小值; Mul:計算兩個數組的元素級的乘積(點乘); Not:按位對數組中的每一個元素求反; Normalize:將數組中元素進行歸一化; Or:對兩個數組進行按位或操作; Ors:在數組與標量之間進行按位或操作; Reduce:通過給定的操作符將二維數組簡為向量; Repeat:以平鋪的方式進行數組復制; Set:用給定值初始化數組; SetZero:將數組中所有元素初始化為0; SetIdentity:將數組中對角線上的元素設為1,其他置0; Solve:求出線性方程組的解; Split:將多通道數組分割成多個單通道數組; Sub:兩個數組元素級的相減; SubS:元素級的從數組中減去標量; SubRS:元素級的從標量中減去數組; Sum:對數組中的所有元素求和; SVD:二維矩陣的奇異值分解; SVBkSb:奇異值回代計算; Trace:計算矩陣跡; Transpose:矩陣的轉置運算; Xor:對兩個數組進行按位異或操作; XorS:在數組和標量之間進行按位異或操作; Zero:將所有數組中的元素置為0; ConvertScaleAbs:計算可選的縮放值的絕對值之后再轉換數組元素的類型; Norm:計算數組的絕對范數, 絕對差分范數或者相對差分范數; And:對兩個數組進行按位與操作; AndS:在數組和標量之間進行按位與操作; Scale:是 ConvertScale的一個宏,可以用來重新調整數組的內容,并且可以將參數從一種數據類型轉換為另一種; T:是函數 Transpose的縮寫; Line:畫直線; Rectangle:畫矩形; Circle:畫圓; Ellipse:畫橢圓; EllipseBox:使用外接矩形描述橢圓; FillPoly、 FillConvexPoly、 PolyLine:畫多邊形; PutText:在圖像上輸出一些文本; InitFont:采用一組參數配置一些用于屏幕輸出的基本個特定字體; Save:矩陣保存; Load:矩陣讀取; OpenFileStorage:為讀/寫打開存儲文件; ReleaseFileStorage:釋放存儲的數據; StartWriteStruct:開始寫入新的數據結構; EndWriteStruct:結束寫入數據結構; WriteInt:寫入整數型; WriteReal:寫入浮點型; WriteString:寫入字符型; WriteComment:寫一個XML或YAML的注釋字串; Write:寫一個對象; WriteRawData:寫入多個數值; WriteFileNode:將文件節點寫入另一個文件存儲器; GetRootFileNode:獲取存儲器最頂層的節點; GetFileNodeByName:在映圖或存儲器中找到相應節點; GetHashedKey:為名稱返回一個惟一的指針; GetFileNode:在映圖或文件存儲器中找到節點; GetFileNodeName:返回文件的節點名; ReadInt:讀取一個無名稱的整數型; ReadIntByName:讀取一個有名稱的整數型; ReadReal:讀取一個無名稱的浮點型; ReadRealByName:讀取一個有名稱的浮點型; ReadString:從文件節點中尋找字符串; ReadStringByName:找到一個有名稱的文件節點并返回它; Read:將對象解碼并返回它的指針; ReadByName:找到對象并解碼; ReadRawData:讀取多個數值; StartReadRawData:初始化文件節點序列的讀取; ReadRawDataSlice:讀取文件節點的內容; GetModuleInfo:檢查IPP庫是否已經正常安裝并且檢驗運行是否正常; ResizeWindow:用來調整窗口的大小; SaveImage:保存圖像; MoveWindow:將窗口移動到其左上角為x,y的位置; DestroyAllWindow:用來關閉所有窗口并釋放窗口相關的內存空間; GetTrackbarPos:讀取滑動條的值; SetTrackbarPos:設置滑動條的值; GrabFrame:用于快速將視頻幀讀入內存; RetrieveFrame:對讀入幀做所有必須的處理; ConvertImage:用于在常用的不同圖像格式之間轉換; Erode:形態腐蝕; Dilate:形態學膨脹; MorphologyEx:更通用的形態學函數; FloodFill:漫水填充算法,用來進一步控制哪些區域將被填充顏色; Resize:放大或縮小圖像; PyrUp:圖像金字塔,將現有的圖像在每個維度上都放大兩倍; PyrSegmentation:利用金字塔實現圖像分割; Threshold:圖像閾值化; Acc:可以將8位整數類型圖像累加為浮點圖像; AdaptiveThreshold:圖像自適應閾值; Filter2D:圖像卷積; CopyMakeBorder:將特定的圖像輕微變大,然后以各種方式自動填充圖像邊界; Sobel:圖像邊緣檢測,Sobel算子; Laplace:拉普拉斯變換、圖像邊緣檢測; HoughLines2:霍夫直線變換; HoughCircles:霍夫圓變換; Remap:圖像重映射,校正標定圖像,圖像插值; WarpAffine:稠密仿射變換; GetQuadrangleSubPix:仿射變換; GetAffineTransform:仿射映射矩陣的計算; CloneImage:將整個IplImage結構復制到新的IplImage中; 2DRotationMatrix:仿射映射矩陣的計算; Transform:稀疏仿射變換; WarpPerspective:密集透視變換(單應性); GetPerspectiveTransform:計算透視映射矩陣; PerspectiveTransform:稀疏透視變換; CartToPolar:將數值從笛卡爾空間到極坐標(極性空間)進行映射; PolarToCart:將數值從極性空間到笛卡爾空間進行映射; LogPolar:對數極坐標變換; DFT:離散傅里葉變換; MulSpectrums:頻譜乘法; DCT:離散余弦變換; Integral:計算積分圖像; DistTransform:圖像的距離變換; EqualizeHist:直方圖均衡化; CreateHist:創建一新直方圖; MakeHistHeaderForArray:根據已給出的數據創建直方圖; NormalizeHist:歸一化直方圖; ThreshHist:直方圖閾值函數; CalcHist:從圖像中自動計算直方圖; CompareHist:用于對比兩個直方圖的相似度; CalcEMD2:陸地移動距離(EMD)算法; CalcBackProject:反向投影; CalcBackProjectPatch:圖塊的方向投影; MatchTemplate:模板匹配; CreateMemStorage:用于創建一個內存存儲器; CreateSeq:創建序列; SeqInvert:將序列進行逆序操作; tSeqToArray:復制序列的全部或部分到一個連續內存數組中; FindContours:從二值圖像中尋找輪廓; DrawContours:繪制輪廓; ApproxPoly:使用多邊形逼近一個輪廓; ContourPerimeter:輪廓長度; ContoursMoments:計算輪廓矩; Moments:計算Hu不變矩; MatchShapes:使用矩進行匹配; InitLineIterator:對任意直線上的像素進行采樣; SampleLine:對直線采樣; AbsDiff:幀差; Watershed:分水嶺算法; Inpaint:修補圖像; GoodFeaturesToTrack:尋找角點; FindCornerSubPix:用于發現亞像素精度的角點位置; CalcOpticalFlowLK:實現非金字塔的Lucas-Kanade稠密光流算法; MeanShift:mean-shift跟蹤算法; CamShift:camshift跟蹤算法; CreateKalman:創建Kalman濾波器; CreateConDensation:創建condensation濾波器; ConvertPointsHomogenious:對齊次坐標進行轉換; FindChessboardCorners:定位棋盤角點; FindHomography:計算單應性矩陣; Rodrigues2:羅德里格斯變換; FitLine:直線擬合算法; CalcCovarMatrix:計算協方差矩陣; Invert:計算協方差矩陣的逆矩陣; Mahalanobis:計算Mahalanobis距離; KMeans2:K均值; CloneMat:根據一個已有的矩陣創建一個新矩陣; PreCornerDetect:計算用于角點檢測的特征圖; GetImage: Mat圖像數據格式轉換成IplImage圖像數據格式; MatMul:兩矩陣相乘;?
27、opencv里面為啥是bgr存儲圖片而不是人們常聽的rgb?
?用opencv讀取圖片時, 默認的通道順序是BGR而非RGB,在RGB為主流的當下, 這種默認給我們帶來了一點不便。那么, opencv 為什么要使用BGR而非RGB呢?
目前看到的一種解釋說是因為歷史原因:早期BGR也比較流行,opencv一開始選擇了BGR,到后來即使RGB成為主流,但也不好改了。
28、講講HOG特征?他在dpm里面怎么設計的,你改過嗎?HOG能檢測邊緣嗎?里面的核函數是啥?那hog檢測邊緣和canny有啥區別?
29、如何求一張圖片的均值?
30、如何寫程序將圖像放大縮小?
31、如何遍歷一遍求一張圖片的方差?
32、給定0-1矩陣,求連通域。
二值圖像分析最重要的方法就是連通區域標記,它是所有二值圖像分析的基礎,它通過對二值圖像中白色像素(目標)的標記,讓每個單獨的連通區域形成一個被標識的塊,進一步的我們就可以獲取這些塊的輪廓、外接矩形、質心、不變矩等幾何參數。
連通域:在圖像中,最小的單位是像素,每個像素周圍有8個鄰接像素,常見的鄰接關系有2種:4鄰接與8鄰接。
如果A與B連通,B與C連通,則A與C連通。在視覺上看來,彼此連通的點形成了一個區域,而不連通的點形成了不同的區域。這樣的一個所有的點彼此連通點構成的集合,我們稱為一個連通區域。
L = bwlabel(BW,n)。
33、
1x1卷積和的作用。34、手推手眼標定(剛面試完,熱乎的呢,答得可以)
halcon 手眼標定原理推導_Σ?συφο?1900的博客-CSDN博客
35、Mat類
opencv Mat類_Σ?συφο?1900的博客-CSDN博客
36、雙線插值
opencv 插值方式_Σ?συφο?1900的博客-CSDN博客
37、SVD矩陣分解
SVD 奇異值分解_Σ?συφο?1900的博客-CSDN博客
38、雙邊濾波原理解析
雙邊濾波與高斯濾波器相比,對于圖像的邊緣信息能夠更好的保存。其原理為一個 與空間距離相關的高斯函數與一個灰度距離相關的高斯函數相乘。
雙邊濾波(Bilateral Filter)原理解析及代碼實現_Σ?συφο?1900的博客-CSDN博客
39、物體在空間中的表達方式,有幾種
40、投影矩陣推導
[圖形學筆記]推導投影矩陣 - 知乎
OpenGL(二)投影矩陣推導 - 知乎
41、canny 算子如何實現
? ? step1: 用高斯濾波器平滑圖象;
? ? step2: 用一階偏導的有限差分來計算梯度的幅值和方向;
? ? step3: 對梯度幅值進行非極大值抑制
? ? ?step4: 用雙閾值算法檢測和連接邊緣
42、深度學習用的是那個
43、模糊和邊緣檢測算子的區別,如果區分
44、PCA 梯度下降原理,數據推導,實現
OpenCV筆記20 PCA_Σ?συφο?1900的博客-CSDN博客
45、SVM 支持向量積?
珠海某上市公司算法總監:
46、相機標定的原理與坐標系之間的轉換,如何轉換
47、激光三角原理,如何搭建
48、測量擬合的過程中有哪些算子,原理什么,接著問5,跌代多少次?什么情況最優,如何優化,
49、那個測量算子的優缺點?
50、如何最優的擬合圓
51、如何最優的擬合直線
52、除了標定halcon的標定方法還有哪些標定方法,分別是什么
53、相機坐標系之間是如何轉換的:
寧德新能源 二面(研發部門總監)
你是內推的嗎(不是,是獵頭讓內推的),有沒有認識的人在寧德新能源(沒有)?
(選型)
1、做過那些方案?項目中你那個是全權完成的,碰到的什么問題?
2、對硬件了解多少?伺服電機選型如何選,光源如何選型?鏡頭如何選?對打光了解嗎?(完全蒙蔽)
3、機械設計有多少了解,多少要了解一些
(語言,問的少,但是問的很深)
1、c#和c++的區別是什么
作為一款更現代的編程語言,C#被設計于與當前微軟.NET框架共同工作,在客戶端和web應用程序中均有涉獵。
C++是一門面向對象的語言,而C#被認為是一門面向組件(component)的編程語言。面向對象編程聚焦于將多個類結合起來鏈接為一個可執行的二進制程序,而面向組件編程使用可交換的代碼模塊(可獨立運行)并且你不需要知道它們內部是如何工作的就可以使用它們。
以下是C++和C#的主要區別。
- C++將代碼編譯成機器碼,而C#將代碼編譯成CLR(一種.NET框架的虛擬機組件,它會被ASP.NET所解析)。
- C++要求用戶手動處理內存,但是C#運行在虛擬機中,而虛擬機會自動處理內存。
- C#不使用指針(pointer),而C++可以在任何時候使用指針。
- 雖然C++的設計是用于Unix或類Unix的系統,但是它可以運行在任何的平臺上。C#雖然已標準化,但是基本上只在Windows的環境下運行。
- C++可以創建獨立(stand-alone)和控制臺(console)程序。C#可以創建控制臺,Windows,ASP.NET和移動(mobile)程序,但不能創建獨立程序
2、什么是鎖,有那幾種鎖,如何解鎖,鎖和內存對應起來如何?
3、多肽是什么?舉例說明
4、多線程之間的交互方式有幾種,如何交互,各自的優缺點是什么
5、文件讀寫
(算法)
1、手眼標定手推一下,(我推完后),具體流程說一下,先后順序能不能亂?為什么
2、簡述base ?object ?tool ? camera的兩量關系,如果建立起來聯系
3、簡述決策樹,
4、一幅圖像中halcon 是如何存貯的,在opencv 中是如何存貯的?為什么要這樣存?
5、什么是最大似然估計
6、什么是圖像的矩,手推一下?
7、好像最近幾個問題感覺你沒有信心了?(我回答:不是,是在絕對的力量面前,嘶吼沒有任何意義,這次面試交流是對我自己的一個清晰定位,以后會怎么做更有方向)
8、三次內插法數學原理,簡單實現
9、halcon 模板匹配的原理,特征檢測的關鍵是什么,什么是特征檢測?
10、什么是滯后閾值處理,為什么這么做,用在那個方面
11、什么是極大值抑制,如何做極大值抑制,為什么要這么做?
面試官:今天就問這么多,面試一個小時了,你有什么想問的嗎?
我回答:(我自己肯定是過不了),你對我的評價是什么?
面試官:自學能力可以,但是做一個優秀的工程師還不夠,對各個方面有了解但是都不深入,你這樣發展下去很難做到一個專家級別。
中間又聊了很多廢話,后面我要了微信,他給我推薦了幾本書,每本書看三遍以上,有什么難解決的問題可以問,但是他不一定有時間回,你先好好學兩年,兩年以后我們再聊。
結束
1、四領域和八領域的區別?
四連通是八連通的子集。也就是說在圖像處理中四連通的區域,一定是八連通
2、連通域是什么,如何理解
圖像的連通域是指圖像中具有相同像素值并且位置相鄰的像素組成的區域
連通域分析是指在圖像中尋找出彼此互相獨立的連通域并將其標記出來,般情況下,一個連通域內只包含一個像素值,因此為了防止像素值波動對提取不同連通域的影響,連通域分析常處理的是二值化后的圖像。
opencv 圖像連通域分析_Σ?συφο?1900的博客-CSDN博客
3、進程間通信方式和線程間通信方式
c++ 線程間通信方式_天行九歌-CSDN博客_c++線程間通信
答:(1)進程間通信方式:
# 管道( pipe ):管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關系的進程間使用。進程的親緣關系通常是指父子進程關系。
# 信號量( semophore ) :信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。它常作為一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作為進程間以及同一進程內不同線程之間的同步手段。
# 消息隊列( message queue ) :消息隊列是由消息的鏈表,存放在內核中并由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩沖區大小受限等缺點。
# 共享內存( shared memory ) :共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號兩,配合使用,來實現進程間的同步和通信。
# 套接字( socket ) :套解口也是一種進程間通信機制,與其他通信機制不同的是,它可用于不同及其間的進程通信。
(2)線程間通信方式:
#全局變量;
#Messages消息機制;
#CEvent對象(MFC中的一種線程通信對象,通過其觸發狀態的改變實現同步與通信)。
4、C++的多態
答:C++的多態性用一句話概括:在基類的函數前加上virtual關鍵字,在派生類中重寫該函數,運行時將會根據對象的實際類型來
調用相應的函數。如果對象類型是派生類,就調用派生類的函數;如果對象類型是基類,就調用基類的函數。
1):用virtual關鍵字申明的函數叫做虛函數,虛函數肯定是類的成員函數;
2):存在虛函數的類都有一個一維的虛函數表叫做虛表,類的對象有一個指向虛表開始的虛指針。虛表是和類對應的,虛表指針是和對象對應的;
3):多態性是一個接口多種實現,是面向對象的核心,分為類的多態性和函數的多態性。;
4):多態用虛函數來實現,結合動態綁定.;
5):純虛函數是虛函數再加上 = 0;
6):抽象類是指包括至少一個純虛函數的類;
純虛函數:virtual void fun()=0;即抽象類,必須在子類實現這個函數,即先有名稱,沒有內容,在派生類實現內容
5、協程
答:定義:協程是一種用戶態的輕量級線程。
協程擁有自己的寄存器上下文和棧。協程調度切換時,將寄存器上下文和棧保存到其他地方,在切回來的時候,恢復先前保存的寄存器上下文和棧。因此:協程能保留上一次調用時的狀態(即所有局部狀態的一個特定組合),每次過程重入時,就相當于進入上一次調用的狀態,換種說法:進入上一次離開時所處邏輯流的位置;
線程是搶占式,而協程是協作式;
協程的優點:
跨平臺
跨體系架構
無需線程上下文切換的開銷
無需原子操作鎖定及同步的開銷
方便切換控制流,簡化編程模型
高并發+高擴展性+低成本:一個CPU支持上萬的協程都不是問題。所以很適合用于高并發處理。
協程的缺點:
無法利用多核資源:協程的本質是個單線程,它不能同時將 單個CPU 的多個核用上,協程需要和進程配合才能運行在多CPU;
進行阻塞(Blocking)操作(如IO時)會阻塞掉整個程序:這一點和事件驅動一樣,可以使用異步IO操作來解決。
8、TCP握手與釋放
答:(1)握手
#第一次握手:主機A發送握手信號syn=1和seq=x(隨機產生的序列號)的數據包到服務器,主機B由SYN=1知道,A要求建立聯機;
#第二次握手:主機B收到請求后要確認聯機信息,向A發送syn=1,ack=x(x是主機A的Seq)+1,以及隨機產生的確認端序列號
seq=y的包;
#第三次握手:主機A收到后檢查ack是否正確(ack=x+1),即第一次發送的seq+1,若正確,主機A會再發送ack=y+1,以及隨機序
列號seq=z,主機B收到后確認ack值則連接建立成功;
#完成三次握手,主機A與主機B開始傳送數據。
注:上述步驟中,第二和第三次確認包中都還包含一個標志位未予以說明,該標志位為1表示正常應答;
為什么需要“三次握手”?
“三次握手”的目的是“為了防止已失效的連接請求報文段突然又傳送到了服務端,因而產生錯誤”。具體例如:client發出的第一個連接請求報文段并沒有丟失,而是在某個網絡結點長時間的滯留了,以致延誤到連接釋放以后的某個時間才到達server。本來這是一個早已失效的報文段。但server收到此失效的連接請求報文段后,就誤認為是client再次發出的一個新的連接請求。于是就向client發出確認報文段,同意建立連接。假設不采用“三次握手”,那么只要server發出確認,新的連接就建立了。由于現在client并沒有發出建立連接的請求,因此不會理睬server的確認,也不會向server發送數據。但server卻以為新的運輸連接已經建立,并一直等待client發來數據。這樣,server的很多資源就白白浪費掉了。采用“三次握手”的辦法可以防止上述現象發生。例如剛才那種情況,client不會向server的確認發出確認。server由于收不到確認,就知道client并沒有要求建立連接。主要目的防止server端一直等待,浪費資源。
(2)揮手
由于TCP連接是全雙工的,因此每個方向都必須單獨進行關閉。這原則是當一方完成它的數據發送任務后就能發送一個FIN來終止這個方向的連接。收到一個 FIN只意味著這一方向上沒有數據流動,一個TCP連接在收到一個FIN后仍能發送數據。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。
(1) TCP客戶端發送一個FIN,用來關閉客戶到服務器的數據傳送(報文段4);
(2) 服務器收到這個FIN,發回一個ACK,確認序號為收到的序號加1(報文段5)。和SYN一樣,一個FIN將占用一個序號;
(3) 服務器關閉客戶端的連接后,再發送一個FIN給客戶端(報文段6);
(4) 客戶段收到服務端的FIN后,發回ACK報文確認,并將確認序號設置為收到序號加1(報文段7);
注意:TCP連接的任何一方都可以發起揮手操作,上述步驟只是兩種之一;
因為當收到對方的FIN報文通知時,它僅僅表示對方沒有數據發送給你了;但未必你所有的數據都全部發送給對方了,所以你可能還需要發送一些數據給對方,再發送FIN報文給對方來表示你同意現在可以關閉連接了,故這里的ACK報文和FIN報文多數情況下都是分開發送的,也就造成了4次揮手。
握手,揮手過程中各狀態介紹:
(1)3次握手過程狀態:
#LISTEN: 這個也是非常容易理解的一個狀態,表示服務器端的某個SOCKET處于監聽狀態,可以接受連接了。
#SYN_SENT: 當客戶端SOCKET執行CONNECT連接時,它首先發送SYN報文,因此也隨即它會進入到了SYN_SENT狀態,并等待服務端的發送三次握手中的第2個報文。SYN_SENT狀態表示客戶端已發送SYN報文。(發送端)
#SYN_RCVD: 這個狀態與SYN_SENT遙想呼應這個狀態表示接受到了SYN報文,在正常情況下,這個狀態是服務器端的SOCKET在建立TCP連接時的三次握手會話過程中的一個中間狀態,很短暫,基本上用netstat你是很難看到這種狀態的,除非你特意寫了一個客戶端測試程序,故意將三次TCP握手過程中最后一個ACK報文不予發送。因此這種狀態時,當收到客戶端的ACK報文后,它會進入到ESTABLISHED狀態。(服務器端)
#ESTABLISHED:這個容易理解了,表示連接已經建立了。
(2)4次揮手過程狀態:
#FIN_WAIT_1: 這個狀態要好好解釋一下,其實FIN_WAIT_1和FIN_WAIT_2狀態的真正含義都是表示等待對方的FIN報文。而這兩種狀態的區別是:FIN_WAIT_1狀態實際上是當SOCKET在ESTABLISHED狀態時,它想主動關閉連接,向對方發送了FIN報文,此時該SOCKET即進入到FIN_WAIT_1狀態。而當對方回應ACK報文后,則進入到FIN_WAIT_2狀態,當然在實際的正常情況下,無論對方何種情況下,都應該馬上回應ACK報文,所以FIN_WAIT_1狀態一般是比較難見到的,而FIN_WAIT_2狀態還有時常常可以用netstat看到。(主動方)
#FIN_WAIT_2:上面已經詳細解釋了這種狀態,實際上FIN_WAIT_2狀態下的SOCKET,表示半連接,也即有一方要求close連接,但另外還告訴對方,我暫時還有點數據需要傳送給你(ACK信息),稍后再關閉連接。(主動方)
#TIME_WAIT: 表示收到了對方的FIN報文,并發送出了ACK報文,就等2MSL后即可回到CLOSED可用狀態了。如果FIN_WAIT_1狀態下,收到了對方同時帶FIN標志和ACK標志的報文時,可以直接進入到TIME_WAIT狀態,而無須經過FIN_WAIT_2狀態。(主動方)
#CLOSING(比較少見): 這種狀態比較特殊,實際情況中應該是很少見,屬于一種比較罕見的例外狀態。正常情況下,當你發送FIN報文后,按理來說是應該先收到(或同時收到)對方的ACK報文,再收到對方的FIN報文。但是CLOSING狀態表示你發送FIN報文后,并沒有收到對方的ACK報文,反而卻也收到了對方的FIN報文。什么情況下會出現此種情況呢?其實細想一下,也不難得出結論:那就是如果雙方幾乎在同時close一個SOCKET的話,那么就出現了雙方同時發送FIN報文的情況,也即會出現CLOSING狀態,表示雙方都正在關閉SOCKET連接。
#CLOSE_WAIT: 這種狀態的含義其實是表示在等待關閉。怎么理解呢?當對方close一個SOCKET后發送FIN報文給自己,你系統毫無疑問地會回應一個ACK報文給對方,此時則進入到CLOSE_WAIT狀態。接下來呢,實際上你真正需要考慮的事情是察看你是否還有數據發送給對方,如果沒有的話,那么你也就可以close這個SOCKET,發送FIN報文給對方,也即關閉連接。所以你在CLOSE_WAIT狀態下,需要完成的事情是等待你去關閉連接。(被動方)
#LAST_ACK: 這個狀態還是比較容易好理解的,它是被動關閉一方在發送FIN報文后,最后等待對方的ACK報文。當收到ACK報文后,也即可以進入到CLOSED可用狀態了。(被動方)
持續更新。。。。。。
總結
以上是生活随笔為你收集整理的halcon opencv 图像处理面试指南的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ipad还能横行霸道多久
- 下一篇: 腾讯云密钥登录的实践