一个自己用的opencv历程

2023-11-01

#include <opencv2/opencv.hpp>
#include"highgui.h"
#include"stdio.h"
#include"cv.h"
#include<ctime>
using namespace cv;
using namespace std;

// Global variables
Rect box,box1;
bool drawing_box = false;
bool gotBB = false;
int count1=0;
int change=0;
int conserve=0;
bool photo=false;
int n=0;
// bounding box mouse callback
void mouseHandler(int event, int x, int y, int flags, void *param){

  switch( event ){

  case CV_EVENT_MOUSEMOVE:
    if (count1==1&&drawing_box){
        box.width = x-box.x;
        box.height = y-box.y;
    }
    else if(count1==2&&drawing_box){
        box1.width = x-box1.x;
        box1.height = y-box1.y;
    }
    break;
  case CV_EVENT_LBUTTONDOWN:
    drawing_box = true;
    count1++;
    if(count1==1){
    box = Rect( x, y, 0, 0 );
    }
    else
        box1=Rect(x,y,0,0);
    break;
  case CV_EVENT_LBUTTONUP:
      
    drawing_box = false;
    if( box.width < 0 ){
        box.x += box.width;
        box.width *= -1;
    }
    if( box.height < 0 ){
        box.y += box.height;
    }
    if(count1==2)
    {
    gotBB = true;
    }
    break;
  }
}
//
void   Delay(int   time)//time*1000为秒数
{
clock_t   now   =   clock();

while(   clock()   -   now   <   time   );
}

IplImage* DoPyrDown(IplImage* image, int filter = IPL_GAUSSIAN_5x5)
{
    // 设置大小缩小一倍
    CvSize size = cvSize(image->width / 2,image->height / 2);
    //初始化图片
    IplImage* outImage = cvCreateImage(size,image->depth,image->nChannels);
    //实现缩放
    cvPyrDown(image,outImage);
    cvReleaseImage(&image);
    return outImage;
}

// tracker: get search patches around the last tracking box,
// and find the most similar one
void tracking(Mat frame, Mat &model, Rect &trackBox)
{
    Mat gray;
    cvtColor(frame, gray, CV_RGB2GRAY);

    Rect searchWindow;
    searchWindow.width = trackBox.width * 3;
    searchWindow.height = trackBox.height * 3;
    searchWindow.x = trackBox.x + trackBox.width * 0.5 - searchWindow.width * 0.5;
    searchWindow.y = trackBox.y + trackBox.height * 0.5 - searchWindow.height * 0.5;
    searchWindow &= Rect(0, 0, frame.cols, frame.rows);

    Mat similarity;
    matchTemplate(gray(searchWindow), model, similarity, CV_TM_CCOEFF_NORMED);

    double mag_r;
    Point point;
    minMaxLoc(similarity, 0, &mag_r, 0, &point);
    trackBox.x = point.x + searchWindow.x;
    trackBox.y = point.y + searchWindow.y;
    model = gray(trackBox);
}
int main(int argc, char * argv[])
{
    VideoCapture capture(0);
    bool fromfile = true;
    //Init camera
    if (!capture.isOpened())
    {
        cout << "capture device failed to open!" << endl;
        return -1;
    }
    //Register mouse callback to draw the bounding box
    cvNamedWindow("Tracker", CV_WINDOW_AUTOSIZE);
    cvSetMouseCallback("Tracker", mouseHandler, NULL );
    Mat frame, model,model1;
    capture >> frame;
    while(!gotBB)
    {
        if (!fromfile)
            capture >> frame;
        imshow("Tracker", frame);
        if (cvWaitKey(20) == 'q')
            return 1;
    }
    //Remove callback
    cvSetMouseCallback("Tracker", NULL, NULL );
    Mat gray;

    cvtColor(frame, gray, CV_RGB2GRAY);
    model = gray(box);
    model1=gray(box1);
    int frameCount = 0;

    while (1)
    {
        capture >> frame;

        if (frame.empty())
            return -1;
        frameCount++;

        // tracking
        tracking(frame, model, box);
        // show
        tracking(frame,model1,box1);
        stringstream buf;
        buf << frameCount;
        string num = buf.str();
        if(change==0)
        {
        rectangle(frame, box, Scalar(0, 0, 255), 3);
        rectangle(frame, box1, Scalar(0, 255, 255), 3);
        }
        Rect rect = box1 & box;
        imshow("Tracker", frame);
           IplImage temp=IplImage(frame);
        IplImage *frame1=&temp;
        if ( cvWaitKey(1) == 27 )
            break;

        if(rect.width>0&&photo==false)
        {
            conserve++;            
            change=1;
            //初始化一张图片
            IplImage* outImage = cvCreateImage(cvGetSize(frame1),frame1->depth,frame1->nChannels);
            // 将原图拷贝过来
            cvCopy(frame1,outImage,NULL);
            //实现缩放操作
            outImage = DoPyrDown(outImage);
            //设置保存的图片名称和格式
            //char* outImageName ="m+test.jpg";
            //保存图片
            if(conserve%18==0)
            {
            photo=true;
            n++;
            char str[20];
            sprintf(str, "%dtest.jpg", n);
            cvSaveImage(str,outImage);
            cvReleaseImage(&outImage);
            printf(" 恭喜你,保存图片成功!\n");
            }

        }
        else if(rect.width<=0)
        {
            photo=false;
            change=0;
        }

    }

    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一个自己用的opencv历程 的相关文章

  • 有没有办法让 Linux CLI IO 重定向持久化?

    我有多个管道命令 如下所示 find options grep options xargs grep options 它们中的每一个都可能产生我不感兴趣的错误 权限错误 文件名空格错误等 因此 我想将所有错误重定向到 dev null 我知
  • 在哪里可以找到所有 C 标准库的源代码?

    我正在寻找所有 C 标准库的完整源代码 也就是说 我正在寻找 stdio h stdlib h string h math h 等的源代码 我想看看它们是如何创建的 我认为这取决于不同的平台 但 Linux 或 Windows 都会受到欢迎
  • 如何在 Linux 中显示进程状态(阻塞、非阻塞)

    有没有办法查询 Linux 进程表中进程的状态 以便能够演示执行查询时进程是正在运行还是被阻止 我的目标是从进程或程序的 外部 执行此操作 因为我希望从操作系统进程的角度来理解这一点 但欢迎任何想法 这是Python代码阻塞的过程 impo
  • 如何更改 Kubernetes 中的文件系统观察程序限制 (fs.inotify.max_user_watches)

    我在用着pm2 https github com Unitech pm2查看保存我的应用程序服务器的 NodeJS 程序源代码的目录 该程序在 Kubernetes 集群中运行 但是 我收到此错误 ENOSPC System limit f
  • 如何修复 /usr/bin/env 参数处理?

    我遇到了一个奇怪的问题 usr bin env 我设计了一个简单的脚本来显示问题 该脚本使用 Ruby 编写 但使用 Python 编写的类似脚本也会发生同样的情况 这是脚本 usr bin env ruby p ARGV 还有一个没有 u
  • 选择多个模式的 awk 代码

    这是我的输入文件 比如modified txt r4544 n479826 2012 08 28 07 12 33 0400 Tue 28 Aug 2012 1 line Changed paths M branches 8 6 0 con
  • 如何使用 shell 脚本解压所有 .tar.gz?

    我试过这个 DIR path tar gz if ls A DIR 2 gt dev null then echo not gz else tar zxvf path tar gz C path tar fi 如果该文件夹有一个 tar 则
  • C 标准库函数与系统调用。哪个是“open()”?

    I know fopen 在C标准库中 所以我绝对可以调用fopen C 程序中的函数 我感到困惑的是为什么我可以打电话给open 功能也一样 open 应该是系统调用 所以它不是标准库中的C函数 因为我能够成功地调用open 函数 我调用
  • 如何更改Linux服务器中的MySQL表名不区分大小写?

    我正在开发一个旧网站 该网站曾经托管在 Apple 服务器上 当它迁移到新的 Linux 服务器时 它停止工作 我很确定这是因为 php 脚本中使用的所有 MySQL 查询对于表名都有不同的大小写组合 我不知道为什么原始开发人员在创建表名或
  • 并发 I/O - 缓冲区损坏、块设备驱动程序

    我开发块分层设备驱动程序 所以 我拦截WRITE请求并加密数据 并解密数据end bio 例行程序 在处理和READ要求 所以在单流中一切正常 但是 如果尝试同时从两个或更多进程执行 I O 我会遇到缓冲区内容损坏的情况 我没有任何本地存储
  • 在Linux中执行jar文件[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我创建了一个可执行的 Java jar 文件 也就是说 我将 java 程序正确打包到 jar 文件中 包括 META INF MANIFEST 文件
  • 带有接收器的 boost_log 示例无法编译

    我正在考虑将 boost log 用于一个项目 一开始我就遇到了以下问题 我在以下位置找到的升压日志示例 http www boost org doc libs 1 54 0 libs log example doc tutorial fi
  • pip 找不到满足要求的版本 django==2.2.1

    我刚刚将操作系统更改为 linux 并且想安装 django 但我无法安装最新版本的 django 我努力了 pip install django 但是它安装了 django 1 11 11 这不是我需要的 我还将我的 pip 升级到了 1
  • 串口读取未完成

    下面的函数用于在Linux下从串口读取数据 我在调试时可以读取完整的数据 但是当我启动程序时 读缓冲区似乎并不完整 我正确接收了一小部分数据 但缓冲区的其余部分完全正确zero 可能是什么问题呢 int8 t serial port ope
  • 如何使用 bash 粘贴来自单独文件的列?

    我想用分隔符 合并不同的列表 第一个列表有 2 个单词 cat first one who 第二个列表有 10000 个单词 cat second languages more simple advanced home expert tes
  • 如何告诉 CMake 将构建文件放在哪里?

    我想告诉 CMake 将文件和文件夹输出到不同的文件夹而不是当前文件夹 我在下面讨论的是 CMake 生成的文件 文件 CMakeCache txt 目录 CMakeFiles 文件 生成文件 目录 bin 文件 cmake install
  • 64位版本的adb和fastboot?

    我在 Debian 7 3 x64 已完全修补 上发现了以下错误 我很确定这是因为adb即使在其 SDK 工具的 64 位发行版中也是 32 位 which adb opt android sdk platform tools adb op
  • 使用多个 NIC 广播 UDP 数据包

    我正在 Linux 中为相机控制器构建嵌入式系统 非实时 我在让网络做我想做的事情时遇到问题 该系统有 3 个 NIC 1 个 100base T 和 2 个千兆端口 我将较慢的连接到相机 这就是它支持的全部 而较快的连接是与其他机器的点对
  • C:运行系统命令并获取输出? [复制]

    这个问题在这里已经有答案了 我想在 Linux 中运行一个命令并获取其输出内容的返回文本 但我do not想要将此文本打印到屏幕上 有没有比制作临时文件更优雅的方法 你想要 popen http linux die net man 3 po
  • 未找到 DEADLINE 调度策略

    我想在 C 中实现 DEADLINE 调度策略 我知道该功能已实现Linux 3 14 10我正在使用 Ubuntu 14 04Linux 3 17 0 031700 lowlatency 201410060605 SMP PREEMPT这

随机推荐

  • C++基础——类与对象的讲解2

    目录 一 类域 二 计算类的大小 类存储方式一 类中包含各个成员 包括函数在内 类存储方式二 类的存储方式三 练习题 三 C 结构内存对齐规则 一 类域 其实类也是个域 拥有一对花括号 它与我们之前学习的命名空间域有相似之处 但也大有不同
  • ovftool工具的使用

    1 工具下载地址 https customerconnect vmware com zh downloads details downloadGroup OVFTOOL440 productId 974 download true file
  • js是实现键盘设置日期(input)

    本功能是基于封装的datetime input框进行的二次封装 加上上下左右修改日期的功能 只提供一种思路 前端框架aurelia formatString formatString country MM DD YY h mm A USA
  • 监控显示服务器超时,国标GB/T28181流媒体服务互联网直播方案EasyGBS录像调取报超时错误如何解决?...

    原标题 国标GB T28181流媒体服务互联网直播方案EasyGBS录像调取报超时错误如何解决 背景分析 视频监控整合人工智能技术 虽然在加强监控的同时也伴随着一些潜在风险 但是潜在的优点显然超过了缺点 且如今人工智能在算法与芯片领域的成熟
  • Packet for query is too large

    mysql 执行insert语句时 提示Packet for query is too large异常 问题点 mysql支持的传输数据包大小超限了 解决办法 比较一劳永逸的方式是直接修改mysql安装目录下的my ini配置文件 增加一行
  • 利用python制作一款截图识别软件

    先给大家推荐一款截图软件 非常方便 可以把截出的图片放置到窗口上 并且可以随意移动 这个是微软开发的一款工具 Snipaste 支持各类电脑系统 先简单介绍一下它的用法 F1截图 ctrl c把图片复制到剪贴板 方便下次使用 ctrl v
  • python协程—asyncio模块

    为什么使用协程 当多线程或者多进程足够多时 实际上并不能解决性能的瓶颈问题 也就是多线程和多进程对小规模的请求可以提高效率 过多的请求实际上会降低服务资源响应效率 因此协程是更好的解决文案 什么是协程 当一个程序遇到阻塞时 如果将这个程序挂
  • (翻译)Linux中的IS_ERR()宏

    本文翻译自 https newbedev com is err macro in linux text 20IS ERR 20 28 29 20macro 20in 20Linux 20Tests 20if can 20find 20MAC
  • VUE3.0生命周期函数

    什么是生命周期 1 vue中每个组件都是独立的 每个组件都有一个属于它的生命周期 2 从一个组件创建 数据初始化 挂载 更新 销毁 这就是一个组件所谓的生命周期 强调的是一个时间段 在vue3中 新增了一个setup生命周期函数 setup
  • 四川岳池2021年高考成绩查询,2021年岳池中学升学率高不高?

    引语 了解一个学校 就要全方位的进行了解 清楚学校的师资 录取分数线 升学率等等 四川初升高升学网网编为同学们梳理了2021年岳池中学升学率高不高的相关信息 更多最新资讯可以关注四川初升高升学网公众号 岳池中学2021升学率 立即点击查看
  • MySQL 表分区 报错:Table has no partition for value XXX

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 对已存在的未分区的表进行分区 alter table test PARTITION BY RANGE id PARTITION p1 VALUES LESS THAN 10
  • 扫码点餐软件,打造智慧餐厅新体验!【点餐小程序】

    随着科技的不断发展 扫码点餐软件成为了越来越多餐厅的选择 它们可以帮助顾客快速方便地点餐 同时也带来了更高效的服务体验和更好的管理效果 在这篇文章中 我们将探讨如何通过扫码点餐软件打造智慧餐厅新体验 并且以一个具体的案例来解析其中的技巧 步
  • 10-6 计算时间差

    时间差可以用来衡量程序运行效率 计算其有三种方法 一是使用 difftime 函数 二是使用自定义的 TimeInMillisecond 函数 三是使用 clock 函数 1 使用 difftime 函数计算秒级时间差 三种方法本质相同 都
  • iTerm2使用笔记

    鼠标 设置在less vim中等使用滚轮 在高级设置里面 设置系统编辑方式 让写命令和在其他编辑器中一致 比如alt delete 删除一个word vim vimrc中设置系统clipboard set clipboard unnamed
  • 机器人学习--卡尔曼滤波及各种滤波解析

    什么是滤波 举个最直观的简单例子 臭水沟里舀一大勺水 需要过滤成干净水怎么办 用滤网 网孔可根据需要选择大小孔 过滤 在电路方面波形的高低通滤波原理类似 图像上的噪声点各种中值滤波等类似的滤波方案 Filter 在状态测量领域是根据 预测
  • webpack 和 ts 简单配置及使用

    如何使用webpack 与 ts结合使用 新建项目 执行项目初始化 npm init y 会生成 name tsdemo01 version 1 0 0 description main index js scripts test echo
  • Notion 的插件介绍和使用

    十分推荐 Save to Notion Notion Web Clipper notion 官方的剪藏插件 插件安装 Chrome 商店 https chrome google com webstore detail notion web
  • 看完这篇 教你玩转渗透测试靶机vulnhub——DC8

    Vulnhub靶机DC8渗透测试详解 Vulnhub靶机介绍 Vulnhub靶机下载 Vulnhub靶机安装 Vulnhub靶机漏洞详解 信息收集 暴力破解 提权 获取flag Vulnhub靶机渗透总结 Vulnhub靶机介绍 vulnh
  • keil仿真调试报错

    问题 程序能正常下载 但是keil仿真调试报错 进入仿真程序就在全速运行了 此时什么都干不了 查看command窗口日志信息会发现有报错 jlink error cpu is not halted 然后点击reset按钮会退出全速仿真 所有
  • 一个自己用的opencv历程

    include