OpenCV 2之视频标注

来源:互联网 发布:linux mv 编辑:程序博客网 时间:2024/06/05 03:48

  在做视频分析时,常常需要标注特定帧的目标图像,而不同的任务需要的功能不一。所以与其求诸人,不如求诸己。自己动手写了个标注程序,总体上还是比较好用的。最关键的是,可以自己进行扩展功能,不受制与商用软件的特定功能。

  好了,现在说明下,实现的基本功能:

(1)可以再任意帧,进行标定任意多的标注框。

(2)标定框自动显示框号。

(3)可以依次撤销上一个标注框,同时可以清除所有标注框。

(4)可以保存任意帧的标注结果。


  效果图:



  程序实现:

  (1)鼠标响应函数:

static void onMouse(int event, int x, int y, int, void*){switch (event){case CV_EVENT_LBUTTONDOWN:isDrawing = true;pt1 = Point(x, y);//确定第一个点break;case CV_EVENT_LBUTTONUP:if (isDrawing){pt2 = Point(x, y);//确定第二个点getRectVec(pt1, pt2, rectVec);//确定标注框,保存之}isDrawing = false;break;default:if (isDrawing){pt2 = Point(x, y);//中间过渡点(第二个点)rectangle(temImg, pt1, pt2, blue);//标注框未定前画蓝色框}break;}}void getRectVec(Point pt1, Point pt2, vector<Rect>& rectVec)//保存标注框{Rect drawBox;drawBox.x = MIN(pt1.x, pt2.x);drawBox.y = MIN(pt1.y, pt2.y);drawBox.width = abs(pt1.x - pt2.x);drawBox.height = abs(pt1.y - pt2.y);drawBox = drawBox&Rect(0, 0, frame.cols, frame.rows);//防止框超出图像范围rectVec.push_back(drawBox);}

  (2)按键程序:

while (1){//rectangle(temImg, pt1, pt2, red);if (!rectVec.empty()){stringstream tems;vector<Rect>::iterator it = rectVec.begin();int i = 0;while (it != rectVec.end()){rectangle(temImg, *it, red);//画所有确定的标注框i++;string str;tems << i;tems >> str;tems.clear();int x = ((*it).x - 2) > 0 ? ((*it).x - 2) : 0;int y = ((*it).y - 3) > 0 ? ((*it).y - 3) : 0;Point pt = Point(x, y);putText(temImg, str + "th", pt, FONT_HERSHEY_SIMPLEX, 0.8, white, 2);//写框号++it;}}stringstream ss;string strg1,strg2;strg2 = "BiaoZhu(";switch ((char)waitKey(1))//按键功能{case 'd'://撤销上一个标注框if (!rectVec.empty()){rectVec.pop_back();}break;case 'c'://清除所有标注框rectVec.clear();break;case 'p'://暂停视频isPause = !(isPause);break;case 's'://保存标注结果ss << num;ss >> strg1;imwrite(strg2 + strg1 + ").jpg", temImg);num++;break;}imshow(windowname, temImg);if (isPause == false){cap >> frame;if (frame.empty()){cout << "End this Video !" << endl;break;}}frame.copyTo(temImg);if ((char)waitKey(10) == 'q')break;//退出程序}
完整程序:http://download.csdn.net/detail/u014019842/7888765


0 0