本程序使用范围:为运动目标跟踪提供ground truth【真实数据】,然后你可以进行各种跟踪算法误差对比
这是写论文的好帮手哦!
内容转自:http://blog.csdn.NET/xiaowei_cqu,是个妹子
我在她代码上稍微改进了下。
代码如下:
- // pic_label.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #include "cv.h"
- #include "highgui.h"
- #include <iostream>
- #include <string>
- #include <vector>
- #include <fstream>
- using namespace std;
- //全局变量
- bool is_drawing=false;
- vector<CvRect> biaozhu_boxs;
- CvRect drawing_box;
- IplImage *img,*img1;
- static void help();
- static void onMouse( int event, int x, int y, int, void* );
- int _tmain(int argc, _TCHAR* argv[])
- {
- CvFont font;
- CvScalar scalar;
- char text[10];
- // 初始化字体
- double hScale=1;
- double vScale=1;
- int lineWidth=3;// 相当于写字的线条
- scalar=CV_RGB(255,0,0);
- cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX|CV_FONT_ITALIC, hScale,vScale,0,lineWidth);//初始化字体,准备写到图片上的
- int frame_counter = 0;
- int obj_id = 0;
- CvCapture *capture=cvCreateFileCapture("a.avi");
- img = cvQueryFrame(capture);
- img1 = cvCreateImage(cvSize(img->width,img->height),IPL_DEPTH_8U,3);
- cvCopy(img,img1);
- ofstream outfile("a.txt");
- help();
- for(vector<CvRect>::iterator it=biaozhu_boxs.begin();it!=biaozhu_boxs.end();++it)
- {
- cvRectangle(img1,cvPoint((*it).x,(*it).y),cvPoint((*it).x + (*it).width,(*it).y + (*it).height),CV_RGB(0,255,0));
- }
- cvShowImage("video",img);
- cvSetMouseCallback( "video", onMouse, 0 );
- while (1)
- {
- int c=cvWaitKey(0);
- if( (c & 255) == 27 )
- {
- cout << "Exiting ...\n";
- break;
- }
- switch((char)c)
- {
- case 'n':
- //read the next frame
- ++frame_counter;
- img = cvQueryFrame(capture);
- cvCopy(img,img1);
- if(!img){
- cout<<"\nVideo Finished!"<<endl;
- return 0;
- }
- //save all of the labeling rects
- for(vector<CvRect>::iterator it=biaozhu_boxs.begin();it!=biaozhu_boxs.end();++it)
- {
- cvRectangle(img1,cvPoint((*it).x,(*it).y),cvPoint((*it).x + (*it).width,(*it).y + (*it).height),CV_RGB(0,255,0));
- itoa(obj_id,text,10);
- cvPutText(img1,text,cvPoint((*it).x,(*it).y),&font,CV_RGB(255,255,255));//在图片中输出字符
- outfile<<frame_counter<<" "<<obj_id<<" "<<(*it).x<<" "
- <<(*it).y<<" "<<(*it).width<<" "
- <<(*it).height<<endl;
- obj_id++;
- }
- obj_id = 0;
- break;
- case 'c':
- //clear all the rects on the image
- biaozhu_boxs.clear();
- cvCopy(img,img1);
- }
- cvShowImage("video",img1);
- }
- cvNamedWindow("video",0);
- cvReleaseCapture(&capture);
- cvDestroyWindow("video");
- return 0;
- }
- static void help()
- {
- cout << "This program designed for labeling video \n"
- <<"Coded by L. Wei on 9/4/2013\n"<<endl;
- cout<<"Use the mouse to draw rectangle on the image for labeling.\n"<<endl;
- cout << "Hot keys: \n"
- "\tESC - quit the program\n"
- "\tn - next frame of the video\n"
- "\tc - clear all the labels\n"
- <<endl;
- }
- static void onMouse( int event, int x, int y, int, void* )
- {
- switch(event)
- {
- case CV_EVENT_LBUTTONDOWN:
- //the left up point of the rect
- is_drawing=true;
- drawing_box.x=x;
- drawing_box.y=y;
- break;
- case CV_EVENT_MOUSEMOVE:
- //adjust the rect (use color blue for moving)
- if(is_drawing){
- drawing_box.width=x-drawing_box.x;
- drawing_box.height=y-drawing_box.y;
- cvCopy(img,img1);
- for(vector<CvRect>::iterator it=biaozhu_boxs.begin();it!=biaozhu_boxs.end();++it)
- {
- cvRectangle(img1,cvPoint((*it).x,(*it).y),cvPoint((*it).x + (*it).width,(*it).y + (*it).height),CV_RGB(0,255,0));
- }
- cvRectangle(img1,cvPoint(drawing_box.x,drawing_box.y),cvPoint(drawing_box.x+drawing_box.width,drawing_box.y+drawing_box.height),CV_RGB(255,0,0));
- }
- break;
- case CV_EVENT_LBUTTONUP:
- //finish drawing the rect (use color green for finish)
- if(is_drawing){
- drawing_box.width=x-drawing_box.x;
- drawing_box.height=y-drawing_box.y;
- cvCopy(img,img1);
- for(vector<CvRect>::iterator it=biaozhu_boxs.begin();
- it!=biaozhu_boxs.end();++it){
- cvRectangle(img1,cvPoint((*it).x,(*it).y),cvPoint((*it).x + (*it).width,(*it).y + (*it).height),CV_RGB(0,255,0));
- }
- cvRectangle(img1,cvPoint(drawing_box.x,drawing_box.y),cvPoint(drawing_box.x+drawing_box.width,drawing_box.y+drawing_box.height),CV_RGB(255,0,0));
- biaozhu_boxs.push_back(drawing_box);
- }
- is_drawing=false;
- break;
- }
- cvShowImage("video",img1);
- return;
- }
功能及用法:
1.鼠标框定目标【可多个】
2.按n,进入下一帧,保存当前框定目标坐标到txt文本【可多个】
3.按c,清除当前帧所有已标定区域【人总有犯错的时候】或者上一帧遗留的区域
文件保存格式:
帧编号 目标编号 矩形左上角坐标 矩形右下角坐标
图片如下:
接下来,就用Matlab尽情的画折线图吧!!吼吼!