在图片上画车位存入txt文件中(1)
在图片上画车位并将车位的信息存入txt文件
功能说明
(1)利用opencv库,在一幅图片上进行画梯形操作
(2)将画出的梯形的信息存入文本文件中代码展示
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
#define OK 0
#define ERR -1
Point pt11[100], pt22[100];
int N = 100; //能画车位的上限,当所画车位较多时,可以修改此值
//用于存放整形的数转换为char字符串之后的数
char locstr[8][4] = {0};
//定义一个数组用来存放在编辑框中所画梯形的点
int *loc = (int*)malloc(sizeof(int)*(8 * N));
Point pt1; //pt1~pt4是画梯形所用的点
Point pt2;
Point pt3;
Point pt4;
Point pta; // pta和ptb是为了保证梯形上下两边平行所用的中间变量
Point ptb;
int n = 0; //用来统计所画车位的个数
Mat src1,dst,src111;
char s[16][20] = { 0 };
int num[16] = { 0 };
FILE *pFile;
void on_mouse(int event, int x, int y, int flags, void* ustc);
int main()
{
pFile = fopen("1.txt","w"); // 文件打开方式为写的方式 如果原来有内容也会销毁
src111 = imread("1.jpg", 1);
imshow("Draw",src111);
setMouseCallback("Draw", on_mouse,(void*)&src111);
waitKey(0);
return OK;
}
void on_mouse(int event, int x, int y, int flags, void* ustc)
{
Mat& dst = *(Mat *)ustc;
if (event == CV_EVENT_LBUTTONDOWN) //点击鼠标左键
{
dst.copyTo(src1);
pt1 = Point(x, y); //把鼠标左键点击的当前点赋值给pt1
circle(src1, pt1, 2, cvScalar(255, 0, 0, 0), CV_FILLED, CV_AA, 0); //画出点pt1
imshow("Draw", src1);
src1.copyTo(dst);
}
else if (event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON)) //不放开左键,拖动鼠标
{
dst.copyTo(src1);
pta = Point(x, y); //定义一个中间点pta,pta的值为鼠标拖动过程中当前点的值
pt2.x = pta.x; //定义一个新的点,这一点的x坐标为鼠标当前的x坐标,y坐标为pt1的y坐标,这样做可以保证所画的线平行
pt2.y = pt1.y;
line(src1, pt1, pt2, cvScalar(0, 255, 0, 0), 1, CV_AA, 0); //连接pt1pt2
imshow("Draw", src1);
}
else if (event == CV_EVENT_LBUTTONUP) //左键放开,并画出点pt2
{
pta = Point(x, y); //pt2的赋值方法和上面一样
pt2.x = pta.x;
pt2.y = pt1.y;
circle(src1, pt2, 2, cvScalar(255, 0, 0, 0), CV_FILLED, CV_AA, 0); //画出pt2
line(src1, pt1, pt2, cvScalar(0, 255, 0, 0), 1, CV_AA, 0); //连接pt1pt2
imshow("Draw", src1);
src1.copyTo(dst);
}
if (pt1.x>0 && (event == CV_EVENT_RBUTTONDOWN))//右键点击画出点pt3
{
pt3 = Point(x, y);
dst.copyTo(src1);
circle(src1, pt3, 2, cvScalar(255, 0, 0, 0), CV_FILLED, CV_AA, 0);
line(src1, pt1, pt3, cvScalar(0, 255, 0, 0), 1, CV_AA, 0);
imshow("Draw", src1);
src1.copyTo(dst);
}
else if (pt1.x>0 && (event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_RBUTTON)))
{
dst.copyTo(src1);
ptb = Point(x, y);
pt4.x = ptb.x;
pt4.y = pt3.y;
line(src1, pt3, pt4, cvScalar(0, 255, 0, 0), 1, CV_AA, 0);
imshow("Draw", src1);
}
else if (pt1.x>0 && (event == CV_EVENT_RBUTTONUP))//右键放开,画出点pt4
{
ptb = Point(x, y);
pt4.x = ptb.x;
pt4.y = pt3.y;
circle(src1, pt4, 2, cvScalar(255, 0, 0, 0), CV_FILLED, CV_AA, 0);
line(src1, pt3, pt4, cvScalar(0, 255, 0, 0), 1, CV_AA, 0);
line(src1, pt2, pt4, cvScalar(0, 255, 0, 0), 1, CV_AA, 0);
imshow("Draw", src1);
src1.copyTo(dst);
n++;//统计所画梯形的总数
//将所画 的矩形的四个顶点的值(int)存入loc数组中
loc[n * 8 + 0] = pt1.x;//将每个梯形的8个点放入到数组loc中
loc[n * 8 + 1] = pt1.y;
loc[n * 8 + 2] = pt2.x;
loc[n * 8 + 3] = pt2.y;
loc[n * 8 + 4] = pt3.x;
loc[n * 8 + 5] = pt3.y;
loc[n * 8 + 6] = pt4.x;
loc[n * 8 + 7] = pt4.y;
//将loc数组中的8个整形数值转换成字符串的形式
for (int i = 0; i < 8; i++)
{
_itoa(loc[n * 8 + i], locstr[i], 10);
}
//将字符串写入文件中1.txt,并显示每个整型值到控制台
for (int i = 0; i < 8; i++)
{
cout << loc[n*8+i] << " ";
fwrite(&locstr[i],
sizeof(locstr[i]),
1,
pFile);
/*fwrite("
",
sizeof("
"),
1,
pFile);*/
fputc(10, pFile);
}
fflush(pFile); //数据刷新 数据立即更新
//fclose(pFile); // 关闭文件
cout << endl;
}
return;
}
- 结果展示
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: 数组保存到文件
- 下一篇: c语言把文件中数据读取并存到数组中