首页 / 操作系统 / Linux / 利用OpenCV给图像添加标注
利用OpenCV给图像添加标注本程序使用范围:为运动目标跟踪提供ground truth【真实数据】,然后你可以进行各种跟踪算法误差对比这是写论文的好帮手哦!代码如下:// 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 ...
";
break;
} switch((char)c)
{
case "n":
//read the next frame
++frame_counter;
img = cvQueryFrame(capture);
cvCopy(img,img1);
if(!img){
cout<<"
Video 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
"
<<"Coded by L. Wei on 9/4/2013
"<<endl; cout<<"Use the mouse to draw rectangle on the image for labeling.
"<<endl; cout << "Hot keys:
"
" ESC - quit the program
"
" n - next frame of the video
"
" c - clear all the labels
"
<<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尽情的画折线图吧!!吼吼!--------------------------------------分割线 --------------------------------------Ubuntu Linux下安装OpenCV2.4.1所需包 http://www.linuxidc.com/Linux/2012-08/68184.htmUbuntu 12.04 安装 OpenCV2.4.2 http://www.linuxidc.com/Linux/2012-09/70158.htmCentOS下OpenCV无法读取视频文件 http://www.linuxidc.com/Linux/2011-07/39295.htmUbuntu 12.04下安装OpenCV 2.4.5总结 http://www.linuxidc.com/Linux/2013-06/86704.htmUbuntu 10.04中安装OpenCv2.1九步曲 http://www.linuxidc.com/Linux/2010-09/28678.htm基于QT和OpenCV的人脸识别系统 http://www.linuxidc.com/Linux/2011-11/47806.htm[翻译]Ubuntu 14.04, 13.10 下安装 OpenCV 2.4.9 http://www.linuxidc.com/Linux/2014-12/110045.htm--------------------------------------分割线 --------------------------------------OpenCV的详细介绍:请点这里
OpenCV的下载地址:请点这里本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-02/114166.htm