日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

姿态检测 树莓派_3.使用树莓派控制摄像头采集视频及运动检测

發布時間:2025/3/13 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 姿态检测 树莓派_3.使用树莓派控制摄像头采集视频及运动检测 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 #include

2 #include

3 #include //時間函數頭

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; //運動檢測預設值(時間)

12 if (argc >= 2) { //判斷參數是否充足判斷

13 detectThreshold = atoi(argv[1]);14 printf("=== Motion detection threshold has been set to: [%d] ===\n", detectThreshold);15 }16

17 /*init 攝影機*/

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); //創建圖像((矩形框大小),顏色深度,通道)31 //就是直接把pFrameB這個圖像復制給dst,不用給 pFrameDiff 特地開辟內存空間了

32 IplImage *pFrameDiff =cvCloneImage(pFrameB);33

34 int nDims = 256;35 float hRangesArr[] = {0, 255};36 float* hRanges =hRangesArr;37 /*直方圖,表上數字圖像中亮度分布的一種圖,標繪了每個像素的亮度數(可以使用直方圖對圖像進行二值化,通過計算差異圖像的直方圖,可以知道這兩附圖有沒有差異*/

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; //用于記錄當前時間戳和防止1次觸發多次監測檢測

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); //計算兩幅圖像的差異

50 cvCopy(pFrameA,pFrameB); //復制圖像,第一個參數是源與第二目標51 //實現了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單倍精度浮點數影像。55 //dst 輸出的8-bit, 16-bit或 32-bit單倍精度浮點數影像。56 //code 色彩空間轉換的模式,該code來實現不同類型的顏色空間轉換。比如CV_BGR2GRAY表示轉換為灰度圖,CV_BGR2HSV將圖片從RGB空間轉換為HSV空間。其中當code選用CV_BGR2GRAY時,dst需要是單通道圖片。當code選用CV_BGR2HSV時,對于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 //用于對直方圖的比例縮放

64 cvConvertScale(pHist->bins, pHist->bins, (fMaxValue ? (255.0 / fMaxValue) : 0.0), 0);65 //檢查是否有運動狀態

66 double dRealtimeVal = cvGetReal1D(pHist->bins, 10);67 if (dRealtimeVal > detectThreshold) { //觸發

68 time_t currentTimestamp =time(NULL);69 if (currentTimestamp - ts >= 1) { //對時間戳進行判斷

70 ts =currentTimestamp;71 printf("Motion detected @ %s", ctime(&currentTimestamp));72 }73 }74 cvReleaseImage(&pGrayscaleImage); //釋放內存

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 }

總結

以上是生活随笔為你收集整理的姿态检测 树莓派_3.使用树莓派控制摄像头采集视频及运动检测的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。