版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、精選文檔機(jī)器視覺課程設(shè)計(jì)對(duì)圓盤形零件圓心與直徑和矩形零件長(zhǎng)與寬尺寸測(cè)量 學(xué)生學(xué)院 機(jī)電學(xué)院 專業(yè)班級(jí) 學(xué) 號(hào) 學(xué)生姓名 指導(dǎo)教師 2015年 1 月 20 日目 錄1 問題描述5 1.1 基本目標(biāo)5 1.2 基本要求52 程序及其算法5 2.1 檢測(cè)與計(jì)算圓半徑的程序5 2.2 檢測(cè)與計(jì)算矩形長(zhǎng)和寬的程序82.2.1 打開攝像頭程序82.2.2 保存拍攝的照片程序92.2.3 讀取拍攝到的圖片(讀取文名字CurrentImage.jpg的圖片)92.2.4 檢測(cè)邊上的點(diǎn)和計(jì)算長(zhǎng)和高的函數(shù)92.2.5 老師寫的顯示圖片的函數(shù)133 運(yùn)行結(jié)果144 小結(jié)151 問題描述1.1 基本目標(biāo) 顯示一張圖
2、片(包含一個(gè)矩形或一個(gè)圓),測(cè)量矩形的長(zhǎng)寬或圓的直徑。完成得及格分,擴(kuò)展有加分!要求圖片1.2 基本要求 “機(jī)器視覺”考試結(jié)果要求獨(dú)立在計(jì)算機(jī)上完成,建議使用Visual C+和OpenCV實(shí)現(xiàn)一個(gè)具有視覺捕捉、圖像顯示、尺寸測(cè)量等功能的對(duì)話框程序,其中必須完成對(duì)圓盤形零件圓心與直徑和矩形零件長(zhǎng)與寬尺寸測(cè)量?jī)?nèi)容。在教師提供的基本框架程序基礎(chǔ)上,修改、補(bǔ)充界面和功能。2 程序及其算法2.1 檢測(cè)與計(jì)算圓半徑的程序 思路:從圖片中間橫掃取點(diǎn)得M_Point0,M_Point1(x坐標(biāo)相加除2的圓心的x坐標(biāo))中間縱向取點(diǎn)得M_Point2,M_Point3(y坐標(biāo)相加除2的圓心的y坐標(biāo))圓上四個(gè)點(diǎn)到
3、圓心的距離(半徑)取平均值,輸出為半徑。顯示圖片程序如下:double c_DialogTeclarn:f_MakeCircle(double e_dThreshold)if(NULL=m_pIplImageSource)return 0;/定義變量存圖像的寬,高,行像素int q_iWidth=m_pIplImageSource->width;int q_iHeight=m_pIplImageSource->height;int q_iWidthStep=m_pIplImageSource->widthStep;uchar *q_pchDataImage=(uchar *)
4、m_pIplImageSource->imageData;CvPoint M_Point4=;/存放檢索出的四個(gè)點(diǎn) 循環(huán)檢索/01縱掃for(int Cycle_Y=1;Cycle_Y<q_iHeight;Cycle_Y+)if(e_dThreshold>q_pchDataImageq_iWidth/2+q_iWidthStep*(Cycle_Y-1)M_Point0.x=q_iWidth/2;M_Point0.y=Cycle_Y;for(int Cycle_Y=q_iHeight;Cycle_Y>1;Cycle_Y-)if(e_dThreshold>q_pchD
5、ataImageq_iWidth/2+q_iWidthStep*(Cycle_Y-1)M_Point1.x=q_iWidth/2;M_Point1.y=Cycle_Y;for(int Cycle_X=1;Cycle_X<q_iWidth;Cycle_X+)if(e_dThreshold>q_pchDataImageCycle_X+q_iWidthStep*(q_iHeight/2-1)M_Point2.x=Cycle_X;M_Point2.y=q_iHeight/2;for(int Cycle_X=q_iWidth;Cycle_X>1;Cycle_X-)if(e_dThres
6、hold>q_pchDataImageCycle_X+q_iWidthStep*(q_iHeight/2-1)M_Point3.x=Cycle_X;M_Point3.y=q_iHeight/2;for (int i=0;i<4;i+)/畫邊界圓cvCircle(m_pIplImageSource,M_Pointi,8,cvScalarAll(127),2);int Ridius=0,clear=0;int circle_y=abs(M_Point1.y+M_Point0.y)/2;int circle_x=abs(M_Point3.x+M_Point2.x)/2;float c=0
7、,j=0;for (int i=0;i<4;i+)j=(M_Pointi.x-circle_x)*(M_Pointi.x-circle_x)+(M_Pointi.y-circle_y)*(M_Pointi.y-circle_y);c=c+sqrt(j);Ridius=c/4;/在窗口中顯示長(zhǎng)和高char ch110,ch210;itoa(Ridius,ch1,10);itoa(clear,ch2,10);SetDlgItemText(IDC_LONG,ch1);SetDlgItemText(IDC_SHORT,ch2);CWnd *e_pCWndPicture=this->GetD
8、lgItem(ID_PICTURE_DISPLAY);f_ControlShowImage(m_pIplImageDisplay,e_pCWndPicture,m_pIplImageSource);cvSaveImage(_T("./Result_Image.jpg"),m_pIplImageSource);return 0;2.2 檢測(cè)與計(jì)算矩形長(zhǎng)和寬的程序 思路:這個(gè)程序主要包括:打開攝像頭-保存圖片(拍照)-加載剛剛保存的圖片-找出點(diǎn)并計(jì)算長(zhǎng)和高 四個(gè)按鈕,每一個(gè)按鈕包含下面的一段代碼,拍攝的圖片保存為CurrentImage.jpg,這里事先保存了一張同名的圖片,所
9、以可以直接點(diǎn)擊Load Image讀取。 2.2.1 打開攝像頭程序void c_DialogTeclarn:OnBnClickedButtonOpenCamera() CvCapture *q_pCvCapture=cvCreateCameraCapture(0); if(NULL=q_pCvCapture) return; IplImage *q_pIplImageCapture=cvQueryFrame(q_pCvCapture); if(NULL=q_pIplImageCapture) return; if(NULL!=m_pIplImageSource) cvReleaseImage
10、(&m_pIplImageSource); m_pIplImageSource=NULL; m_pIplImageSource=cvCloneImage(q_pIplImageCapture); cvReleaseCapture(&q_pCvCapture); CWnd *e_pCWndPicture=this->GetDlgItem(ID_PICTURE_DISPLAY); f_ControlShowImage(m_pIplImageDisplay,e_pCWndPicture,m_pIplImageSource);注:綠色的為檢測(cè)是否成功打開攝像頭,藍(lán)色的是讀取攝像頭
11、拍攝的圖片到內(nèi)存,后面的語句是讓圖片在mfc窗口顯示出來。 2.2.2 保存拍攝的照片程序void c_DialogTeclarn:OnBnClickedButtonSaveImage() / TODO: 在此添加控件通知處理程序代碼 cvSaveImage(_T("./CurrentImage.jpg"),m_pIplImageSource); 2.2.3 讀取拍攝到的圖片(讀取文名字CurrentImage.jpg的圖片)void c_DialogTeclarn:OnBnClickedButtonLoadImage()/ TODO: 在此添加控件通知處理程序代碼if(N
12、ULL!=m_pIplImageSource)cvReleaseImage(&m_pIplImageSource);m_pIplImageSource=NULL;m_pIplImageSource=cvLoadImage(_T("./CurrentImage.jpg"),0);CWnd *e_pCWndPicture=this->GetDlgItem(ID_PICTURE_DISPLAY);f_ControlShowImage(m_pIplImageDisplay,e_pCWndPicture,m_pIplImageSource); 2.2.4 檢測(cè)邊上的點(diǎn)和
13、計(jì)算長(zhǎng)和高的函數(shù)思路是:第一步找到邊上的點(diǎn),設(shè)定一個(gè)變量e_dThreshold值為127,通過循環(huán)讓它與每一個(gè)像素的像素值進(jìn)行比較。如果檢測(cè)到一個(gè)點(diǎn)的像素值比127小,則這個(gè)點(diǎn)可能就是需要的點(diǎn)(黑色=0,白色=255)如果每個(gè)像素都要比較運(yùn)算太多,所以上邊兩個(gè)點(diǎn)的檢測(cè)是沿著圖片長(zhǎng)的的2/5分處和3/5分處向下檢測(cè),下邊的點(diǎn)是沿著1/2處向上檢測(cè)。第二步是用找到6個(gè)點(diǎn)的坐標(biāo)算出三角形的面積,然后除以底邊邊長(zhǎng)得到高。求三角形的面積用的是行列式 的值等于三角形面積的2倍程序如下:double c_DialogTeclarn:f_MakeRectangleWidth(double e_dThresh
14、old) / TODO: 在此添加控件通知處理程序代碼/定義一些點(diǎn)和變量 int q_iWidth=m_pIplImageSource->width; int q_iHeight=m_pIplImageSource->height; int q_iWidthStep=m_pIplImageSource->widthStep; uchar *q_pchDataImage=(uchar *)m_pIplImageSource->imageData; int q_iXLeftTop=2*q_iWidth/5; int q_iXRightTop=3*q_iWidth/5; in
15、t q_iXBottom=q_iWidth/2; int q_iYLeftTop=2*q_iHeight/5; int q_iYLeftBottom=3*q_iHeight/5; int q_iYRightMid=q_iHeight/2; CvPoint q_CvPointLeftTop,q_CvPointRightTop,q_CvPointBottom; CvPoint q_CvPointLeft_Top,q_CvPointRight_Mid,q_CvLeft_Bottom; /求上下兩邊上的點(diǎn),3個(gè)循環(huán) for(int q_iCycleHeight=0;q_iCycleHeight<
16、q_iHeight;q_iCycleHeight+) if(e_dThreshold>q_pchDataImageq_iCycleHeight*q_iWidthStep+q_iXLeftTop) q_CvPointLeftTop.x=q_iXLeftTop; q_CvPointLeftTop.y=q_iCycleHeight; break; for(int q_iCycleHeight=0;q_iCycleHeight<q_iHeight;q_iCycleHeight+) if(e_dThreshold>q_pchDataImageq_iCycleHeight*q_iWidt
17、hStep+q_iXRightTop) q_CvPointRightTop.x=q_iXRightTop; q_CvPointRightTop.y=q_iCycleHeight; break; for(int q_iCycleHeight=q_iHeight-1;q_iCycleHeight>=0;q_iCycleHeight-) if(e_dThreshold>q_pchDataImageq_iCycleHeight*q_iWidthStep+q_iXBottom) q_CvPointBottom.x=q_iXBottom; q_CvPointBottom.y=q_iCycleH
18、eight; break; /求左右兩邊上的點(diǎn),3個(gè)循環(huán) for(int q_iCycleWidth=0;q_iCycleWidth<q_iHeight;q_iCycleWidth+) if(e_dThreshold>q_pchDataImageq_iCycleWidth+q_iWidthStep*(q_iYLeftTop-1) q_CvPointLeft_Top.x=q_iCycleWidth; q_CvPointLeft_Top.y=q_iYLeftTop; break; for(int q_iCycleWidth=0;q_iCycleWidth<q_iHeight;q_
19、iCycleWidth+) if(e_dThreshold>q_pchDataImageq_iCycleWidth+q_iWidthStep*(q_iYLeftBottom-1) q_CvLeft_Bottom.x=q_iCycleWidth; q_CvLeft_Bottom.y=q_iYLeftBottom; break; for(int q_iCycleWidth=q_iHeight-1;q_iCycleWidth>=0;q_iCycleWidth-) if(e_dThreshold>q_pchDataImageq_iCycleWidth+q_iWidthStep*(q_
20、iYRightMid-1) q_CvPointRight_Mid.x=q_iCycleWidth; q_CvPointRight_Mid.y=q_iYRightMid; break; /在檢測(cè)到的點(diǎn)上畫圓,只是為了更好看到找點(diǎn)的情況 cvCircle(m_pIplImageSource,q_CvPointLeftTop,5,cvScalarAll(127),2); cvCircle(m_pIplImageSource,q_CvPointRightTop,5,cvScalarAll(127),2); cvCircle(m_pIplImageSource,q_CvPointBottom,5,cvS
21、calarAll(127),2); cvCircle(m_pIplImageSource,q_CvPointLeft_Top,5,cvScalarAll(127),2); cvCircle(m_pIplImageSource,q_CvLeft_Bottom,5,cvScalarAll(127),2); cvCircle(m_pIplImageSource,q_CvPointRight_Mid,5,cvScalarAll(127),2);/顯示畫圓后的圖片 CWnd *e_pCWndPicture=this->GetDlgItem(ID_PICTURE_DISPLAY); f_Contro
22、lShowImage(m_pIplImageDisplay,e_pCWndPicture,m_pIplImageSource);/計(jì)算長(zhǎng)和高的像素值,三角形3點(diǎn)的坐標(biāo)構(gòu)成行列式,行列式的值=2*面積,行列式的值/底邊=高CvMat Ma;int HIGH,WIDE;float Area;int a=q_CvPointLeftTop.x-q_CvPointRightTop.x;int b=q_CvPointLeftTop.y-q_CvPointRightTop.y;double c=a*a+b*b;/定義行列式double arr9=q_CvPointLeftTop.x,q_CvPointLef
23、tTop.y,1,q_CvPointRightTop.x,q_CvPointRightTop.y,1,q_CvPointBottom.x,q_CvPointBottom.y,1;cvInitMatHeader(&Ma,3,3,CV_64FC1,arr);Area=abs(cvDet(&Ma);HIGH=Area/sqrt(c);int A=q_CvPointLeft_Top.x-q_CvLeft_Bottom.x;int B=q_CvPointLeft_Top.y-q_CvLeft_Bottom.y;double C=A*A+B*B;/定義行列式Double ARR9=q_Cv
24、PointLeft_Top.x,q_CvPointLeft_Top.y,1,q_CvLeft_Bottom.x,q_CvLeft_Bottom.y,1,q_CvPointRight_Mid.x,q_CvPointRight_Mid.y,1;cvInitMatHeader(&Ma,3,3,CV_64FC1,ARR);Area=abs(cvDet(&Ma);WIDE=Area/sqrt(C);/在窗口中顯示長(zhǎng)和高 char ch110,ch210; itoa(HIGH,ch1,10); itoa(WIDE,ch2,10); SetDlgItemText(IDC_LONG,ch1);
25、 SetDlgItemText(IDC_SHORT,ch2); cvSaveImage(_T("./Result_Image.jpg"),m_pIplImageSource); return 0;/調(diào)用上面的函數(shù)進(jìn)行檢測(cè)點(diǎn)和計(jì)算長(zhǎng)和高的值,點(diǎn)擊第四個(gè)按鈕會(huì)調(diào)用這段程序,當(dāng)里面的函數(shù)調(diào)用時(shí),它會(huì)調(diào)用上面那段函數(shù)void c_DialogTeclarn:OnBnClickedButtonRectangle() / TODO: 在此添加控件通知處理程序代碼 f_MakeRectangleWidth(); 2.2.5 老師寫的顯示圖片的函數(shù)void c_DialogTeclarn:
26、f_ControlShowImage(IplImage *&e_pIplImageShow,CWnd *e_pCWndControl, IplImage *e_pIplImageSource) if(NULL=e_pCWndControl)|(NULL=e_pIplImageSource) return; CRect q_CRectControl; e_pCWndControl->GetClientRect(&q_CRectControl); if(NULL!=e_pIplImageShow) cvReleaseImage(&e_pIplImageShow); e
27、_pIplImageShow=NULL; e_pIplImageShow=cvCreateImage(cvSize(q_CRectControl.Width(),q_CRectControl.Height(), IPL_DEPTH_8U, e_pIplImageSource->nChannels); cvResize(e_pIplImageSource,e_pIplImageShow); HDC q_HDCControl=e_pCWndControl->GetDC()->GetSafeHdc(); unsigned int q_piBuffersizeof(BITMAPINF
28、OHEADER)+sizeof(RGBQUAD)*256; BITMAPINFO *e_pBITMAPINFODisplay=(BITMAPINFO *)q_piBuffer; BITMAPINFOHEADER *e_pBITMAPINFOHEADERDisplay=&(e_pBITMAPINFODisplay->bmiHeader); memset(e_pBITMAPINFOHEADERDisplay,0,sizeof(*e_pBITMAPINFOHEADERDisplay); e_pBITMAPINFOHEADERDisplay->biSize=sizeof(BITMA
29、PINFOHEADER); e_pBITMAPINFOHEADERDisplay->biWidth=e_pIplImageShow->width; e_pBITMAPINFOHEADERDisplay->biHeight=-e_pIplImageShow->height; e_pBITMAPINFOHEADERDisplay->biPlanes=1; e_pBITMAPINFOHEADERDisplay->biBitCount=8*e_pIplImageShow->nChannels; e_pBITMAPINFOHEADERDisplay->biCompression=BI_RGB; RGBQUA
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024綜合崗位勞動(dòng)協(xié)議模板版B版
- 2024年版城市出租車租賃協(xié)議樣式版B版
- 2025年消防安全管理咨詢及標(biāo)準(zhǔn)制定合同2篇
- 2024-2025學(xué)年高中歷史第七單元復(fù)雜多樣的當(dāng)代世界第24課兩極對(duì)峙格局的形成學(xué)案含解析岳麓版必修1
- 2024-2025學(xué)年高中語文課時(shí)分層作業(yè)4歸去來兮辭并序含解析新人教版必修5
- 二零二四年度時(shí)尚傳媒廣告投放及制作合同
- 2025年度道路照明燈具批發(fā)合同范本3篇
- 2025年酒店客房銷售渠道建設(shè)與維護(hù)合同3篇
- 2025年度綠色生態(tài)農(nóng)業(yè)種植承包合同范本3篇
- 2025年蔬菜種植戶與農(nóng)產(chǎn)品電商平臺(tái)合作合同范本3篇
- 2025年度影視制作公司兼職制片人聘用合同3篇
- 兒童糖尿病的飲食
- 2025屆高考語文復(fù)習(xí):散文的結(jié)構(gòu)與行文思路 課件
- 干細(xì)胞項(xiàng)目商業(yè)計(jì)劃書
- 拉薩市2025屆高三第一次聯(lián)考(一模)語文試卷(含答案解析)
- 浙江省嘉興市2024-2025學(xué)年高一數(shù)學(xué)上學(xué)期期末試題含解析
- 2024年高考新課標(biāo)Ⅱ卷語文試題講評(píng)課件
- 無人機(jī)航拍技術(shù)教案(完整版)
- 人教PEP版(2024)三年級(jí)上冊(cè)英語Unit 4《Plants around us》單元作業(yè)設(shè)計(jì)
- 《保密法》培訓(xùn)課件
- 醫(yī)院項(xiàng)目竣工驗(yàn)收和工程收尾階段的管理措施專項(xiàng)方案
評(píng)論
0/150
提交評(píng)論