牛骨文教育服务平台(让学习变的简单)
博文笔记

在图片上画车位存入txt文件中(1)

创建时间:2016-05-06 投稿人: 浏览次数:450

在图片上画车位并将车位的信息存入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;
}
  • 结果展示
    这里写图片描述
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。