如题,最近要帮师兄做一些图片标记的工作,很繁琐。写了些很简短的程序,放着吧,省的以后自己再用给弄丢了。
如下,程序完成的主要功能是:打开一个窗口,显示视频第一帧,你在窗口中点击鼠标左键时,点击处会用红点标记,同时鼠标点击处的坐标值输出到.txt文件中。按下空格或其他键跳转下一帧。。。
不多说,上源码:
#include<iostream>
#include<opencv2/opencv.hpp>
#include <fstream>
using namespace cv;
using namespace std;
void on_MouseHandle(int event, int x, int y, int flags, void* param);
ofstream OutFile("dount.txt", ios::out|ios::binary);
Mat frame;//定义一个Mat变量,用于存储每一帧的图像
int main() {
//【1】读入视频
VideoCapture capture("test.mp4");
namedWindow("record_point_window", WINDOW_NORMAL);
setMouseCallback("record_point_window",on_MouseHandle);
//【2】循环显示每一帧
int i = 0;
char name[20];
while(1)
{
// Mat frame;//定义一个Mat变量,用于存储每一帧的图像
capture>>frame; //读取当前帧
i++;
OutFile << i;
//若视频播放完成,退出循环
if (frame.empty())
{
break;
}
// sprintf(name, "output\\%d.jpg", i);//输出到上级目录的output文件夹下
// imwrite(name,frame);//输出一张jpg图片到工程目录下
sprintf(name, "%d", i);
putText( frame, name, Point(0, 20), FONT_HERSHEY_SIMPLEX, 0.6, Scalar(0,255,0));
imshow("record_point_window",frame); //显示当前帧
waitKey(0); //直到有按键按下
OutFile << endl;
}
return 0;
}
void on_MouseHandle(int event, int x, int y, int flags, void* param)
{
Point pt;
// Mat& image = *(cv::Mat*) param;
switch(event)
{
//左键按下消息
case EVENT_LBUTTONDOWN:
{
pt = Point(x, y);
OutFile << " " << pt.x << " " << pt.y;
cv::circle(frame, pt, 10, cv::Scalar(0, 0, 255), -1);
imshow("record_point_window", frame); //显示当前帧
}
break;
}
}