姿态检测 树莓派_3.使用树莓派控制摄像头采集视频及运动检测
1 #include
2 #include
3 #include //時(shí)間函數(shù)頭
4 #include "opencv.hpp"
5
6 /**7 * A program to detect motion in front of an USB camera using OpenCV.8 **/
9
10 int main(int argc, char **argv) {11 int detectThreshold = 19; //運(yùn)動(dòng)檢測(cè)預(yù)設(shè)值(時(shí)間)
12 if (argc >= 2) { //判斷參數(shù)是否充足判斷
13 detectThreshold = atoi(argv[1]);14 printf("=== Motion detection threshold has been set to: [%d] ===\n", detectThreshold);15 }16
17 /*init 攝影機(jī)*/
18 CvCapture* pCapture = cvCreateCameraCapture(0);19 if (NULL ==pCapture) {20 fprintf(stderr, "Can't initialize webcam!\n");21 return 1;22 }23 cvSetCaptureProperty(pCapture, CV_CAP_PROP_FRAME_WIDTH, 640);24 cvSetCaptureProperty(pCapture, CV_CAP_PROP_FRAME_HEIGHT, 480);25 cvSetCaptureProperty(pCapture, CV_CAP_PROP_BRIGHTNESS, 20);26 cvSetCaptureProperty(pCapture, CV_CAP_PROP_CONTRAST, 10);27
28 /*圖像指針*/
29 IplImage *pFrameA = cvQueryFrame(pCapture); //從攝像頭或者文件中抓取并返回一幀
30 IplImage *pFrameB = cvCreateImage(cvSize(pFrameA->width, pFrameA->height), pFrameA->depth, pFrameA->nChannels); //創(chuàng)建圖像((矩形框大小),顏色深度,通道)31 //就是直接把pFrameB這個(gè)圖像復(fù)制給dst,不用給 pFrameDiff 特地開辟內(nèi)存空間了
32 IplImage *pFrameDiff =cvCloneImage(pFrameB);33
34 int nDims = 256;35 float hRangesArr[] = {0, 255};36 float* hRanges =hRangesArr;37 /*直方圖,表上數(shù)字圖像中亮度分布的一種圖,標(biāo)繪了每個(gè)像素的亮度數(shù)(可以使用直方圖對(duì)圖像進(jìn)行二值化,通過計(jì)算差異圖像的直方圖,可以知道這兩附圖有沒有差異*/
38 IplImage *pGrayscaleImage =NULL;39 CvHistogram *pHist = cvCreateHist(1, &nDims, CV_HIST_ARRAY, &hRanges, 1);40 float fMaxValue = 0.0;41
42 time_t ts = 0; //用于記錄當(dāng)前時(shí)間戳和防止1次觸發(fā)多次監(jiān)測(cè)檢測(cè)
43 while(true) {44 pFrameA = cvQueryFrame(pCapture); //從攝像頭或者文件中抓取并返回一幀
45 if(!pFrameA){ //判斷是否成功采集
46 fprintf(stdout,"Can't grab images!\n");47 break;48 }49 cvAbsDiff(pFrameB,pFrameA,pFrameDiff); //計(jì)算兩幅圖像的差異
50 cvCopy(pFrameA,pFrameB); //復(fù)制圖像,第一個(gè)參數(shù)是源與第二目標(biāo)51 //實(shí)現(xiàn)了8位深的灰度圖像
52 pGrayscaleImage = cvCreateImage(cvGetSize(pFrameDiff),IPL_DEPTH_8U,1);53 //void cvCvtColor( const CvArr* src, CvArr* dst, int code );54 //src 輸入的 8-bit,16-bit或 32-bit單倍精度浮點(diǎn)數(shù)影像。55 //dst 輸出的8-bit, 16-bit或 32-bit單倍精度浮點(diǎn)數(shù)影像。56 //code 色彩空間轉(zhuǎn)換的模式,該code來實(shí)現(xiàn)不同類型的顏色空間轉(zhuǎn)換。比如CV_BGR2GRAY表示轉(zhuǎn)換為灰度圖,CV_BGR2HSV將圖片從RGB空間轉(zhuǎn)換為HSV空間。其中當(dāng)code選用CV_BGR2GRAY時(shí),dst需要是單通道圖片。當(dāng)code選用CV_BGR2HSV時(shí),對(duì)于8位圖,需要將RGB值歸一化到0-1之間。這樣得到HSV圖中的H范圍才是0-360,S和V的范圍是0-1。
57 cvCvtColor(pFrameDiff, pGrayscaleImage, CV_BGR2GRAY);58 cvCalcHist(&pGrayscaleImage, pHist, 0, 0);59
60 fMaxValue = 0.0;61 //找到直方圖中最大最小直方塊,以及他們的位置,并保存到 fMaxValue 中
62 cvGetMinMaxHistValue(pHist, 0, &fMaxValue, 0, 0);63 //用于對(duì)直方圖的比例縮放
64 cvConvertScale(pHist->bins, pHist->bins, (fMaxValue ? (255.0 / fMaxValue) : 0.0), 0);65 //檢查是否有運(yùn)動(dòng)狀態(tài)
66 double dRealtimeVal = cvGetReal1D(pHist->bins, 10);67 if (dRealtimeVal > detectThreshold) { //觸發(fā)
68 time_t currentTimestamp =time(NULL);69 if (currentTimestamp - ts >= 1) { //對(duì)時(shí)間戳進(jìn)行判斷
70 ts =currentTimestamp;71 printf("Motion detected @ %s", ctime(¤tTimestamp));72 }73 }74 cvReleaseImage(&pGrayscaleImage); //釋放內(nèi)存
75 pGrayscaleImage =NULL;76
77 cvWaitKey(10); //等待n毫秒
78 }79 //停止捕獲圖像和釋放資源
80 cvReleaseCapture(&pCapture);81 cvReleaseHist(&pHist);82 cvReleaseImage(&pFrameA);83 cvReleaseImage(&pFrameB);84 cvReleaseImage(&pFrameDiff);85
86 pCapture =NULL;87 pHist =NULL;88 pFrameA =NULL;89 pFrameB =NULL;90 pFrameDiff =NULL;91
92 return 0;93 }
總結(jié)
以上是生活随笔為你收集整理的姿态检测 树莓派_3.使用树莓派控制摄像头采集视频及运动检测的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中注解动态传参_SpringMV
- 下一篇: micropython函数库下载_Pyt