借助OpenCV给图像添加标注
发布时间:2021-11-19 15:53:19 所属栏目:教程 来源:互联网
导读:利用OpenCV给图像添加标注 本程序使用范围:为运动目标跟踪提供ground truth【真实数据】,然后你可以进行各种跟踪算法误差对比 这是写论文的好帮手哦! 代码如下: // pic_label.cpp : 定义控制台应用程序的入口点。 // #include stdafx.h #include cv.h #i
利用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 ...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/2013n"<<endl; cout<<"Use the mouse to draw rectangle on the image for labeling.n"<<endl; cout << "Hot keys: n" "tESC - quit the programn" "tn - next frame of the videon" "tc - clear all the labelsn" <<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,清除当前帧所有已标定区域【人总有犯错的时候】或者上一帧遗留的区域 文件保存格式: 帧编号目标编号矩形左上角坐标矩形右下角坐标 (编辑:南通站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |