《數(shù)字圖像處理及工程應用》課件第16章_第1頁
《數(shù)字圖像處理及工程應用》課件第16章_第2頁
《數(shù)字圖像處理及工程應用》課件第16章_第3頁
《數(shù)字圖像處理及工程應用》課件第16章_第4頁
《數(shù)字圖像處理及工程應用》課件第16章_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

2024/8/21第1頁第16章OpenCV圖像處理16.1基礎數(shù)據結構16.1.1cv命名空間1、使用指示字2、通過cv::說明符#include"opencv2/core/core.hpp"usingnamespacecv;

//…MatH=imread(“l(fā)ena.jpg”);#include"opencv2/core/core.hpp"http://…cv::MatH=imread(“l(fā)ena.jpg”);2024/8/21第2頁第16章OpenCV圖像處理16.1.2cv數(shù)據結構1、數(shù)據類型類型名含義等價類型類型名含義等價類型CV_8U8bit無符號字符型ucharCV_32S32bit有符號整型intCV_8S8bit有符號整型scharCV_32F32bit浮點類型floatCV_16U16bit無符號整型ushortCV_64F64bit浮點類型doubleCV_16S16bit有符號整型short注:可以用于定義多通道數(shù)據類型注意:其中使用最多的是類型是CV_8U_C1和CV_8U_C3,分別為單通道和三通道的8位無符號整型2024/8/21第3頁第16章OpenCV圖像處理2、基礎結構注意:其中常用的是類型是Point、Size、Ptr、Rect和Scalar。2024/8/21第4頁第16章OpenCV圖像處理16.1.3Mat基本圖像容器1、Mat結構頭2024/8/21第5頁第16章OpenCV圖像處理2、Mat結構成員函數(shù)(1)矩陣的創(chuàng)建方法2024/8/21第6頁【例.1】:MatM(7,7,CV_32FC2,Scalar(1,3));//創(chuàng)建7×7的復數(shù)矩陣,并用1+3j填充M.create(100,60,CV_8UC(15));//創(chuàng)建100×60的15通道的8bit無符號字符型矩陣M.create(Size(60,100),CV_8UC(15));//與上一行代碼等價intsz[]={100,100,100};MatbigCube(3,sz,CV_8U,Scalar::all(0));第16章OpenCV圖像處理2024/8/21第7頁第16章OpenCV圖像處理【例.2】:繼上例,欲將矩陣M的第7列拷貝給第1列MatM1=M.col(1);M.col(7).copyTo(M1);注意:矩陣的拷貝(copyTo方法)拷貝的只是矩陣頭并修改源矩陣的refcounter指針,并不將源矩陣的實際數(shù)據拷貝至目的矩陣,故上例目的不能達到。(2)矩陣的拷貝2024/8/21第8頁第16章OpenCV圖像處理【例.3】:新建一個三通道圖像img,并將(10,10,100,100)的矩形區(qū)域置為綠色Matimg(Size(320,240),CV_8UC3);Matroi(img,Rect(10,10,100,100));roi=Scalar(0,255,0);【例.4】:利用數(shù)組初始化矩陣M,再將矩陣M克隆至矩陣Ndoublem[3][3]={{1,2,3},{4,5,6},{7,8,9}};MatM=Mat(3,3,CV_64F,m);MatN=M.clone();矩陣N的內容將和矩陣M的完全一致,且都獨立分配內存空間。(3)矩陣的克隆【建議使用】2024/8/21第9頁第16章OpenCV圖像處理(4)矩陣的初始化【例.6】:產生“0”/“1”矩陣MatA;A=Mat::zeros(3,3,CV_32F);MatB=Mat::ones(100,100,CV_8U)*3【例.5】:intm[3][3]={{1,2,3},{4,5,6},{7,8,9}};MatM=Mat(3,3,CV_8U,m);2024/8/21第10頁第16章OpenCV圖像處理(5)矩陣的存取【例.7】:at方法MatH(100,100,CV_64F);for(inti=0;i<H.rows;i++)for(intj=0;j<H.cols;j++)H.at<double>(i,j)=255.H.at<double>(i,j);(6)矩陣的運算①點積:要求兩個矩陣(M、N)的大小、類型相同M.dot(N);2024/8/21第11頁第16章OpenCV圖像處理②叉積:要求兩個矩陣必須為相同大小、類型的三元組浮點類型M.cross(N);③乘除:multiply(M,N,D,0.8);//點乘divide(M,N,D);//點除M.mul(5/N);//等價于divide(M,N,5);D=M*N;//兩個矩陣相乘④加減add(M,N,D);//D=M+Nsubtract(M,N,D);//D=M.N2024/8/21第12頁第16章OpenCV圖像處理⑤求逆N=M.inv();⑥轉置N=M.t();3、Mat結構成員函數(shù)OpenCV提供了非常豐富的矩陣操作的API函數(shù),幾乎囊括了所有必需的基本矩陣運算,這些函數(shù)包括:絕對值、絕對差、求逆、對數(shù)運算、指數(shù)運算、模運算、特征值求解、最大(小)值、轉置、歸一化、奇異值分解等等,詳見OpenCV參考手冊。2024/8/21第13頁第16章OpenCV圖像處理16.2.1

輸入/輸出16.2OpenCV圖像操作1、裝載圖像Mat

imread(conststring&

filename,int

flags=1

);//適用于C++2024/8/21第14頁第16章OpenCV圖像處理2、保存圖像bool

imwrite(conststring&

filename,InputArray

image,constvector<int>&

params=vector<int>())2024/8/21第15頁第16章OpenCV圖像處理16.2.2

圖像存取1、獲取像素值①單通道圖像: Scalarintensity=img.at<uchar>(x,y);②三通道圖像:按B、G、R排列

Vec3bintensity=img.at<Vec3b>(x,y); ucharblue=intensity.val[0]; uchargreen=intensity.val[1]; ucharred=intensity.val[2];

Vec3fintensity=img.at<Vec3f>(x,y); floatblue=intensity.val[0]; floatgreen=intensity.val[1]; floatred=intensity.val[2];2024/8/21第16頁第16章OpenCV圖像處理2、修改像素值 img.at<uchar>(x,y)=128;注:<…>中的類型須與圖像數(shù)據的實際類型一致。16.2.3

底層操作1、賦值

Img=Scalar(0);2、ROI操作 Rectr(10,10,100,100); MatsmallImg=img(r);3、色彩轉換

cvtColor(img,grey,CV_BGR2GRAY);2024/8/21第17頁第16章OpenCV圖像處理16.2.4

圖像顯示 Matimg=imread("image.jpg");

namedWindow("image",CV_WINDOW_AUTOSIZE);

imshow("image",img);

waitKey();16.2.5

圖像處理API1、圖像濾波medianFilter,GaussianFilter,bilateralFilter,blur,boxFilter,filter2D,GaussianBlur,Smooth,medianBlur,Laplacian,Sobel,imdilate,imerode2024/8/21第18頁第16章OpenCV圖像處理2、圖像變換invertAffineTransform,warpAffine,warpPerspective,LogPolar,resize,dct,dft,adaptiveThreshold,cvtColor,floodFill,integral,watershed

3、圖像直方圖calcHist,equalizeHist,NormalizeHist,ThreshHist4、結構分析與形狀描述moments,HuMoments,findContours,drawContours,contourArea,ApproxChains,boundingRect,……5、特征檢測Canny,HoughCircles,HoughLines,MatchTemplate6、視頻操作VideoCapture::open,isOpened,release,grab,……VideoWriter::open,isOpened,write2024/8/21第19頁第16章OpenCV圖像處理16.3.1

控制臺模式16.3

OpenCV編程舉例1、基本原理給圖像添加噪聲,實際上就是對圖像中像素點的灰度值進行隨機修改,通過隨機數(shù)產生函數(shù)取得像素點的行、列坐標,然后對該像素點的灰度值按照事先約定的方式置為0或255的過程;圖像平滑的方式,按照數(shù)字圖像處理的理論有多種方式,如均值濾波、中值濾波、高斯平滑濾波等等,這些基本的圖像處理算法在OpenCV中都提供了相應的API函數(shù)。本例采用中值濾波進行平滑處理。

2024/8/21第20頁第16章OpenCV圖像處理2、程序源碼(1)包含所需的頭文件#include<iostream>//標準輸入/輸出流#include<vector> //矢量//OpenCV圖像處理包 #include"opencv2/imgproc/imgproc.hpp"http://OpenCV高層GUI包 #include"opencv2/highgui/highgui.hpp"http://OpenCV二維特征檢測與描述包 #include"opencv2/features2d/features2d.hpp"(2)聲明命名空間 usingnamespacestd;

//C++標準std命名空間usingnamespacecv; //OpenCV命名空間

2024/8/21第21頁第16章OpenCV圖像處理(3)自定義函數(shù)原型聲明(可選)voidaddNoise(Mat&image,intn,intnoise);//圖像加噪自定義函數(shù)

(4)main函數(shù):主函數(shù)intmain(void){//建立三個窗口,分別用于顯示源圖像、加噪后圖像和平滑后的圖像

namedWindow("Source",CV_WINDOW_AUTOSIZE);namedWindow("Noised",CV_WINDOW_AUTOSIZE);namedWindow("Smoothed",CV_WINDOW_AUTOSIZE);//定義圖像容器src,并加載圖像lena.pngMatsrc=imread("lena.png",CV_BGR2GRAY);if(src.empty())return1;//判斷是否加載成功

imshow("Source",src); //顯示源圖像

addNoise(src,2000,255);//給圖像加入隨機噪聲imshow("Noised",src); //顯示加噪后的圖像

medianBlur(src,src,3);//對加噪后的圖像進行中值濾波平滑處理imshow("Smoothed",src); //顯示平滑后的圖像waitKey(); //等待用戶按鍵}

2024/8/21第22頁第16章OpenCV圖像處理(5)addNoise函數(shù):用于對圖像添加隨機噪聲//入口參數(shù):image—待添加噪聲的源圖像;n—加入噪聲點個數(shù);noise—噪聲類型//出口參數(shù):無voidaddNoise(Mat&image,intn=1000,intnoise=0){srand(getTickCount()); //產生隨機數(shù)種子if(image.empty())return;//判斷源圖像是否有效for(intl=0;l<n;l++){ //循環(huán)添加噪聲點inti=rand()%image.rows; //隨機噪聲點行坐標intj=rand()%image.cols; //隨機噪聲點列坐標if(image.channels()>=3){ //圖像通道數(shù)判斷for(intk=0;k<image.channels();k++)//多通道image.at<Vec3b>(i,j)[k]=noise;//添加噪聲}else{ //單通道 image.at<uchar>(i,j)=noise;//添加噪聲}}}2024/8/21第23頁第16章OpenCV圖像處理2、運行結果

圖16.1加噪后的圖像圖16.2中值濾波平滑后的圖像2024/8/21第24頁第16章OpenCV圖像處理16.3.2

GUI界面模式按照15.2節(jié)的方法,(1)在Code::Blocks中新建工程;(2)工程模板選擇“wxWidgetsProjects”;(3)GUI界面設計器選擇“wxFormbuilder”;(4)應用程序類型選擇“FrameBased”;(5)其余頁面選項可根據實際情況確定,如wxWidgets是以動態(tài)鏈接庫還是靜態(tài)鏈接庫等等。關鍵步驟如圖16.3和圖16.4所示。

1、新建工程2024/8/21第25頁第16章OpenCV圖像處理圖16.3GUI設計器及應用程序類型選擇圖16.4wxWidgets庫設置wxSmith、wxFormbuilder分別是Code::Blocks自帶的設計器插件和為外部GUI設計器。建議初學者使用wxFormbuilder。【UsewxWidgetsDLL】:勾選表示使用DLL方式?!綞nableunicode】:勾選表示支持Unicode字符編碼。2024/8/21第26頁第16章OpenCV圖像處理2、GUI界面設計本GUI案例采用如表16.4所示的wxWidgets組件來設計完成,GUI界面的外觀如圖16.5所示。組件類功能在本案例中用途wxFrame框架窗口GUI頂層窗口wxMenuBar菜單提供菜單操作wxSizer布局容器提供GUI界面中各組件的布局功能wxStaticLine靜態(tài)線條用于GUI界面不同區(qū)域的分割線wxStaticText靜態(tài)文本用于顯示字符信息wxTextCtrl文本控件用于接收用戶輸入數(shù)據wxChoice選項控件提供用戶選擇(噪聲類型、平滑算法)wxButton按鈕執(zhí)行某種操作(如加噪、平滑濾波)表16.4所用到的wxWidgets組件2024/8/21第27頁第16章OpenCV圖像處理圖16.5wxFormbuilder下的GUI界面外觀2024/8/21第28頁第16章OpenCV圖像處理(1)菜單處理:本例只為“F文件”菜單中的“O打開”命令項的OnMenuSelection事件添加處理函數(shù)“OnFileopen”處理函數(shù),完成打開一個圖像文件的操作。其余菜單項的事件處理采用系統(tǒng)生成的默認操作。(2)命令按鈕:分別為“加噪”、“平滑”兩個按鈕的“OnButtonClick”和“OnUpdateUI”事件添加處理函數(shù):OnBtnAddNoise、OnUpdateUIAddnoise、OnBtnSmooth和OnUpdateUISmooth。3、生成代碼按15.3的方法,點擊工具欄“GenerateCode”按鈕和菜單“Tools\GenerateInheritedClass”生成GUI界面的C++代碼和派生類,并將派生類中事件處理函數(shù)的聲明和實現(xiàn)代碼框架拷貝到設計主文件,修改并完善相關代碼。2024/8/21第29頁第16章OpenCV圖像處理4、代碼分析本例的源代碼包含三個類和一個資源文件:應用程序類ImageSmoothApp、GUI界面類GUIFrame、resource.rc和ImageSmoothMain。(1)應用程序類ImageSmoothApp類2024/8/21第30頁第16章OpenCV圖像處理2024/8/21第31頁第16章OpenCV圖像處理(2)設計主文件ImageSmoothFrame類2024/8/21第32頁第16章OpenCV圖像處理2024/8/21第33頁第16章OpenCV圖像處理2024/8/21第34頁第16章OpenCV圖像處理2024/8/21第35頁第16章OpenCV圖像處理2024/8/21第36頁第16章OpenCV圖像處理2024/8/21第37頁第16章OpenCV圖像處理2024/8/21第38頁第16章OpenCV圖像處理2024/8/21第39頁第16章OpenCV圖像處理2024/8/21第40頁第16章OpenCV圖像處理2024/8/21第41頁第16章OpenCV圖像處理2024/8/21第42頁第16章OpenCV圖像處理2024/8/21第43頁第16章OpenCV圖像處理2024/8/21第44頁第16章OpenCV圖像處理2024/8/21第45頁第16章OpenCV圖像處理(3)GUIFrame類GUIFrame是wxFormbuilder根據用戶GUI設計的布局自動生成的代碼,并作為類ImageSmoothFrame的父類加以繼承。關于GUIFram

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論