您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“OpenCV如何使用BSM統計視頻中移動的對象”,內容詳細,步驟清晰,細節處理妥當,希望這篇“OpenCV如何使用BSM統計視頻中移動的對象”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
案例:使用BackgroundSubstractor實現視頻中移動對象統計
實現步驟:
1.實例化VideoCapture
2.創建BackgroundSubstractor
3.while循環讀取視頻幀
4.使用BS->apply獲取mask
5.對mask進行二值化及形態學操作
6.使用findContours執行輪廓發現
7.統計最大外接矩形
8.輸出結果
ps:這個算法的抗干擾能力比較差,要相出正確的結果,必須要對frame進行預處理。或者提升視頻的質量才行。不然只能得到一個錯誤的結果
Move_Video_Object_Tracking::Move_Video_Object_Tracking(QWidget *parent) : MyGraphicsView{parent} { this->setWindowTitle("視頻中移動對象統計"); QPushButton *btn = new QPushButton(this); btn->setText("選擇視頻"); connect(btn,&QPushButton::clicked,[=](){ choiceVideo(); }); } void Move_Video_Object_Tracking::choiceVideo(){ path = QFileDialog::getOpenFileName(this,"請選擇視頻","/Users/yangwei/Downloads/",tr("Image Files(*.mp4 *.avi)")); qDebug()<<"視頻路徑:"<<path; showMoveVideoObjectTracking(path.toStdString().c_str()); } void Move_Video_Object_Tracking::showMoveVideoObjectTracking(const char* filePath){ VideoCapture capture; capture.open(filePath); if(!capture.isOpened()){ qDebug()<<"無法加載視頻文件"; return; } Ptr<BackgroundSubtractor> mogSubstractor = createBackgroundSubtractorMOG2(); Mat frame,gauss,mask; Mat kernel = getStructuringElement(MORPH_RECT,Size(3,3)); int count=0; char text[8]; while(capture.read(frame)){ GaussianBlur(frame,gauss,Size(5,5),0,0); mogSubstractor->apply(gauss,mask);//獲取mask threshold(mask,mask,0,255,THRESH_BINARY|cv::THRESH_OTSU); //執行形態學操作 morphologyEx(mask,mask,MORPH_OPEN,kernel); dilate(mask,mask,kernel,Point(-1,-1)); imshow("mask",mask); //找到最大輪廓定位外接矩形 vector<vector<Point>> contours; vector<Vec4i> heri; //尋找最大外接矩形 findContours(mask,contours,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE); count = 0; for(size_t i = 0;i<contours.size();i++){ double area = contourArea(contours[i]); if(area<5000){ continue; } Rect rect = boundingRect(contours[i]); qDebug()<<rect.width<<":"<<rect.height; if (rect.width < 200 || rect.height < 100) continue; count++; rectangle(frame,rect,Scalar(0,0,255),3,8); sprintf(text,"%d",count); putText(frame,text,Point(rect.x+rect.width/2,rect.y+rect.height/2),FONT_ITALIC, FONT_HERSHEY_PLAIN,Scalar(0,255,0),2,8); } imshow("frame",frame); int c = waitKey(1); if(c==27){ break; } } capture.release(); }
讀到這里,這篇“OpenCV如何使用BSM統計視頻中移動的對象”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。