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