
opencv面試復(fù)習(xí)1 OpenCV 中cv::Mat的深拷貝和淺拷貝問(wèn)題cv::Mat默認(rèn)賦值和拷貝構(gòu)造是淺拷貝只復(fù)制矩陣頭信息底層像素?cái)?shù)據(jù)共享OpenCV 通過(guò)引用計(jì)數(shù)管理內(nèi)存。這樣可以減少大圖像復(fù)制帶來(lái)的性能開(kāi)銷。如果需要真正復(fù)制圖像數(shù)據(jù)需要使用clone()或copyTo()實(shí)現(xiàn)深拷貝。2 OpenCV 中 RGB2GRAY 是怎么實(shí)現(xiàn)的RGB 轉(zhuǎn)灰度本質(zhì)是把三通道彩色圖像轉(zhuǎn)換為單通道亮度圖像。不是簡(jiǎn)單求平均而是按照人眼對(duì)不同顏色的敏感程度進(jìn)行加權(quán)求和。常用公式是Gray 0.299R 0.587G 0.114B。在 OpenCV 中由于默認(rèn)通道順序是 BGR所以通常使用cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY)完成轉(zhuǎn)換。3 連續(xù)圖像轉(zhuǎn)化為數(shù)字圖像需要進(jìn)行哪些操作連續(xù)圖像轉(zhuǎn)換為數(shù)字圖像主要包括采樣和量化兩個(gè)過(guò)程。采樣是把連續(xù)空間坐標(biāo)離散成有限個(gè)像素點(diǎn)決定圖像的空間分辨率量化是把連續(xù)的灰度值或顏色值離散成有限等級(jí)比如 8 位圖像中像素值范圍是 0 到 255。之后再按照一定圖像格式進(jìn)行編碼和存儲(chǔ)比如 JPG、PNG 或 BMP。4 數(shù)字圖像中有哪些基本特征數(shù)字圖像的基本特征包括顏色特征、灰度特征、邊緣特征、紋理特征、形狀特征和局部特征。顏色特征描述圖像的顏色分布灰度特征描述亮度變化邊緣特征反映物體邊界紋理特征反映局部重復(fù)結(jié)構(gòu)形狀特征描述目標(biāo)幾何輪廓局部特征如 SIFT、ORB 可用于圖像匹配和目標(biāo)識(shí)別。5 圖像邊緣檢測(cè)中常用的邊緣檢測(cè)算子有哪些邊緣檢測(cè)本質(zhì)上是在找灰度變化劇烈的位置而噪聲點(diǎn)也會(huì)造成灰度突變。如果不先濾波噪聲也可能被誤檢測(cè)為邊緣。使用高斯濾波可以平滑圖像減少噪聲干擾讓邊緣檢測(cè)結(jié)果更穩(wěn)定。尤其是 Laplacian 和Canny一般都會(huì)先進(jìn)行高斯濾波。常用邊緣檢測(cè)算子主要有 Roberts、Prewitt、Sobel、Scharr、Laplacian、LoG 和 Canny。Roberts 和 Prewitt 屬于比較基礎(chǔ)的一階梯度算子計(jì)算簡(jiǎn)單但抗噪能力一般。Sobel 是比較常用的一階梯度算子通過(guò) x 和 y 方向模板計(jì)算灰度梯度能檢測(cè)水平和垂直邊緣并且具有一定平滑效果。Scharr 可以看作 Sobel 的改進(jìn)在 3×3 卷積核下梯度精度更高。Laplacian 是二階導(dǎo)數(shù)算子可以檢測(cè)各個(gè)方向的邊緣但對(duì)噪聲敏感所以通常會(huì)先進(jìn)行高斯濾波。LoG 就是先高斯濾波再做 Laplacian用來(lái)提高抗噪能力。6 canny邊緣檢測(cè)的流程Canny 邊緣檢測(cè)一般包括五個(gè)步驟。首先將圖像轉(zhuǎn)為灰度圖然后通過(guò)高斯濾波去除噪聲。接著計(jì)算圖像的梯度幅值和梯度方向用來(lái)判斷灰度變化劇烈的位置。然后進(jìn)行非極大值抑制只保留梯度方向上的局部最大值使邊緣變細(xì)。最后使用雙閾值檢測(cè)區(qū)分強(qiáng)邊緣、弱邊緣和非邊緣并通過(guò)邊緣連接保留與強(qiáng)邊緣相連的弱邊緣得到最終邊緣圖。所以 Canny 得到的邊緣通常更細(xì)、更連續(xù)抗噪能力也更好但計(jì)算過(guò)程比 Sobel 更復(fù)雜參數(shù)選擇也更重要?;叶葓D → 高斯濾波 → 計(jì)算梯度 → 非極大值抑制 → 雙閾值檢測(cè)與邊緣連接#includeopencv2/opencv.hpp#includeiostreamintmain(){// 1. 讀取原始圖像// imread 默認(rèn)以 BGR 三通道格式讀取圖片cv::Mat srccv::imread(road.jpg);// 判斷圖片是否讀取成功if(src.empty()){std::cout讀取圖片失敗std::endl;return-1;}// gray灰度圖// edgesCanny 邊緣檢測(cè)結(jié)果圖cv::Mat gray;cv::Mat edges;// 2. 將彩色圖像轉(zhuǎn)換為灰度圖// 霍夫直線檢測(cè)通?;谶吘増D而邊緣檢測(cè)一般先在灰度圖上進(jìn)行cv::cvtColor(src,gray,cv::COLOR_BGR2GRAY);// 3. 高斯濾波降低噪聲// 噪聲可能會(huì)被 Canny 誤檢測(cè)為邊緣所以先進(jìn)行平滑處理// Size(5, 5)高斯核大小// 1.5標(biāo)準(zhǔn)差控制模糊程度cv::GaussianBlur(gray,gray,cv::Size(5,5),1.5);// 4. Canny 邊緣檢測(cè)// 50低閾值// 150高閾值// Canny 內(nèi)部會(huì)完成梯度計(jì)算、非極大值抑制、雙閾值檢測(cè)和邊緣連接cv::Canny(gray,edges,50,150);// 5. 用于保存檢測(cè)到的直線// Vec4i 中保存一條線段的兩個(gè)端點(diǎn)// line[0], line[1] 表示起點(diǎn)坐標(biāo) x1, y1// line[2], line[3] 表示終點(diǎn)坐標(biāo) x2, y2std::vectorcv::Vec4ilines;// 6. 概率霍夫直線檢測(cè)// 輸入必須是邊緣圖一般使用 Canny 的輸出結(jié)果cv::HoughLinesP(edges,// 輸入邊緣圖lines,// 輸出檢測(cè)到的線段1,// rho 分辨率單位為像素CV_PI/180,// theta 分辨率單位為弧度這里表示 1 度80,// 投票閾值越大檢測(cè)出的直線越少50,// 最小線段長(zhǎng)度小于該長(zhǎng)度的線段會(huì)被過(guò)濾10// 最大線段間隔小于該間隔的線段會(huì)被合并);// 7. 遍歷檢測(cè)到的所有直線并畫(huà)到原圖上for(constautoline:lines){cv::line(src,// 要繪制的目標(biāo)圖像cv::Point(line[0],line[1]),// 線段起點(diǎn)cv::Point(line[2],line[3]),// 線段終點(diǎn)cv::Scalar(0,0,255),// 線條顏色BGR 格式這里是紅色2// 線條寬度);}// 8. 顯示 Canny 邊緣檢測(cè)結(jié)果cv::imshow(edges,edges);// 9. 顯示繪制霍夫直線后的結(jié)果圖cv::imshow(lines,src);// 10. 等待按鍵否則窗口會(huì)一閃而過(guò)cv::waitKey(0);return0;}7 OpenCV 中圖像加法 cv::add() 與圖像融合 cv::addWeighted() 有何區(qū)別cv::add() 是圖像加法直接對(duì)兩張圖對(duì)應(yīng)位置的像素進(jìn)行相加結(jié)果超過(guò) 255 會(huì)進(jìn)行飽和截?cái)嗨匀菀壮霈F(xiàn)過(guò)曝。cv::addWeighted() 是加權(quán)融合計(jì)算公式是 dst src1 * alpha src2 * beta gamma可以通過(guò) alpha 和 beta 控制兩張圖的融合比例常用于透明疊加、水印、圖像融合和檢測(cè)結(jié)果可視化。二者都要求輸入圖像的尺寸、通道數(shù)和數(shù)據(jù)類型一致。如果不一致需要先進(jìn)行 resize() 或顏色空間轉(zhuǎn)換。