《学习Opencv》第五章 习题6
生活随笔
收集整理的這篇文章主要介紹了
《学习Opencv》第五章 习题6
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
這是第五章 習(xí)題5、6的結(jié)合版,其中實(shí)現(xiàn)了攝像頭抓拍功能,能夠成功運(yùn)行。
#include "stdafx.h" #include "cv.h" #include "highgui.h"void* getImage() {CvCapture* capture=cvCreateCameraCapture(0);IplImage *img1=NULL,*img2=NULL,*img3=NULL,*frame=NULL,*ppImage=NULL;char keycode;cvNamedWindow("frame");if(capture!=NULL){frame=cvQueryFrame(capture); //注意任何視頻(包括攝像頭獲取的視頻的第一幀都是空幀,要從下一幀開始才是圖像)while(1){frame=cvQueryFrame(capture);cvShowImage("frame",frame);keycode=cvWaitKey(30);if(keycode==27)break;//保存第一張想要保存的圖像if(keycode=='1'){img1=cvCreateImage(cvGetSize(frame),frame->depth,1); //將通道數(shù)為1對應(yīng)灰度圖像,再將frame利用cvConvertImage轉(zhuǎn)換成灰度圖像cvConvertImage(frame,img1); //也可以利用cvCvtColor(frmae,img1,CV_BGR2GRAY)轉(zhuǎn)成灰度圖像cvSaveImage("C:/Users/shark/Desktop/1.jpg",img1); }//保存第二張想要的圖像:相對于第一張圖像多出一個水杯之類的東西if(keycode=='2'){img2=cvCreateImage(cvGetSize(frame),frame->depth,1);cvConvertImage(frame,img2);cvSaveImage("C:/Users/shark/Desktop/2.jpg",img2);}}}img3=cvCreateImage(cvGetSize(frame),frame->depth,1);ppImage=cvCreateImage(cvGetSize(frame),frame->depth,1);//差的絕對值、二值化閾值、開操作cvAbsDiff(img1,img2,img3);cvThreshold(img3,img1,20,255,CV_THRESH_BINARY);cvMorphologyEx(img1,img3,NULL,NULL,CV_MOP_OPEN);cvCopy(img3,ppImage);cvSaveImage("C:/Users/shark/Desktop/3.jpg",ppImage);cvReleaseImage(&img1);cvReleaseImage(&img2);cvReleaseImage(&img3);cvReleaseCapture(&capture);cvDestroyAllWindows();return ppImage; }bool findImage(IplImage* pImage,char nVal, CvPoint* pPos) {char* ptr=NULL;if(pImage->nChannels==1){ptr=pImage->imageData;if(ptr!=NULL){for(int row=0;row<pImage->height;row++){for(int col=0;col<pImage->width;col++){if(ptr[col]==nVal) //此處圖像顏色類型為uchar{pPos->x=col;pPos->y=row;return true;}if(ptr[col]>150) //???{int x=0;}}ptr+=pImage->widthStep;}}}return false; }int main() {IplImage* pImg=NULL;CvPoint oldPoint={0,0},curPoint={0,0};int nArea=0,newArea=0;CvConnectedComp comp;char* szMyWin="my win";pImg=(IplImage*)getImage();if(pImg!=NULL){do{if(findImage(pImg,255,&curPoint)) //找像素值為255的像素點(diǎn){cvFloodFill(pImg,curPoint,cvScalar(100),cvScalar(0),cvScalar(0),&comp,8|CV_FLOODFILL_FIXED_RANGE);if(comp.area<nArea){if(comp.area>0)cvFloodFill(pImg,curPoint,cvScalar(0),cvScalar(0),cvScalar(0),&comp,8|CV_FLOODFILL_FIXED_RANGE); }else{newArea=comp.area;if(nArea>0) //此為對之前區(qū)域填充cvFloodFill(pImg,oldPoint,cvScalar(0),cvScalar(0),cvScalar(0),&comp,8|CV_FLOODFILL_FIXED_RANGE);memcpy(&oldPoint,&curPoint,sizeof(CvPoint));//oldPoint=curPoint;nArea=newArea;}}else{cvFloodFill(pImg,oldPoint,cvScalar(255),cvScalar(0),cvScalar(0),&comp,8|CV_FLOODFILL_FIXED_RANGE); //填充最后的最大區(qū)域break;}}while(true);cvSaveImage("C:/Users/shark/Desktop/4.jpg",pImg);cvNamedWindow(szMyWin);cvShowImage(szMyWin,pImg);cvWaitKey(0);cvReleaseImage(&pImg);cvDestroyWindow(szMyWin);} }
轉(zhuǎn)載于:https://www.cnblogs.com/luckyboylch/p/4905706.html
總結(jié)
以上是生活随笔為你收集整理的《学习Opencv》第五章 习题6的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NGINX前端代理TOMCAT取真实客户
- 下一篇: iOS使用NSMutableAttrib