《Opencv3编程入门》学习笔记—第二章

news2024/11/25 23:25:58

《Opencv3编程入门》学习笔记

记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。

第二章 OpenCV 官方例程引导与赏析

openv官方提供的示例程序:具体位于..\opencv\sources\samples\cpp
在这里插入图片描述..\opencv\sources\samples\cpp\tutorial_code路径下存放着和官方教程配套的示例程序

一、opencv OpenCV 官方例程引导与赏析

可以自己动手运行一下官方的示例程序,书上的有的具体地址都没给。

(一)彩色目标跟踪:Camshift

程序的用法是根据鼠标框选区域的色度光谱来进行摄像头读入的视频目标的跟踪。
详见目录:..\opencv\sources\samples\cpp\camshiftdemo.cpp
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(二)光流:optical flow

光流法是目前运动图像分析的重要方法,包含了目标运动信息。
只有官方demo运行图,没有具体地址。
在这里插入图片描述

(三)点跟踪:lkdemo

程序运行后,会自动启用摄像头没,这时按键盘上的"r"键来启动自动点跟踪,便可以看到如图2.7所示的效果图。而我们在摄像头中移动物体,可以看到物体上的点随着物体一同移动,如图2.8所示。
详见目录:..\opencv\sources\samples\cpp\lkdemo.cpp
在这里插入图片描述

(四)人脸识别:Camshift

运行程序,将自己的脸对准摄像头,或者放置一张照片对准摄像头任其捕获,便可以发现程序准确地识别出了人脸,并用彩色的圆将脸圈出。
详见目录:..\opencv\sources\samples\cpp\tutorial_code\objectDetection
还需要将..\opencv\sources\data\haarcascades路径下的haarcascade_eye_tree_eyeglasses.xmlhaarcascade_frontalface_alt.xml复制到和源文件同一目录下,才能正确运行。
相机不好使…效果图如书上所示:
在这里插入图片描述

(五)支持向量机引导

只有官方demo运行图,没有具体地址。
第一个程序是使用CvSVM::train函数训练一个SVM分类器。
在这里插入图片描述
第二个程序主要用于讲解在训练数据线性不可分时,如何定义支持向量机的最优化问题。
在这里插入图片描述

二、开源的魅力:编译OpenCV源代码

(一)下载安装CMake

官网下载地址:https://cmake.org/

在这里插入图片描述
打开:点击快捷方式或进入安装路径D:\software\CMake\bin,找到cmake-gui.exe运行。
在这里插入图片描述

(二)使用CMake生成OpenCV源代码工程的解决方案

  • 点击Browse Source按钮,选择D:/software/opencv/sources(opencv安装时源代码的存储路径)
  • 点击Browse Build按钮,选择D:/programming/opencv/Solution(自定义路径)
  • 点击Configure按钮
    默认选择对应版本的Visual Studio编译器,默认就行(我这里没有vs10,会报错,待解决)
    在这里插入图片描述

在这里插入图片描述
点击finish就会生成对应的VS2010的sln解决方案。
看到进度条读到最后,出现Configuring done就完成了。
在这里插入图片描述

  • 第二次Configure。再次单击Configure按钮
  • 在这里插入图片描述
  • 单击Generate。生成最终的解决方案,出现Configuring done就完成了。解决方案放在第二步我们选择的自定义路径下。
    在这里插入图片描述
    在这里插入图片描述

(三)编译OpenCV源代码

打开"OpenCV.sln"解决方案包含67个项目的解决方案
在这里插入图片描述
可以点击任意一个我们感兴趣的项目,查看源代码并调试。

三、“opencv.hpp”头文件认知

opencv.hpp包含了OpenCV各模块的头文件。

#ifndef __OPENCV_ALL_HPP__
#define __OPENCV_ALL_HPP__

#include "opencv2/core/core_c.h"
#include "opencv2/core/core.hpp"
#include "opencv2/flann/miniflann.hpp"
#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/photo/photo.hpp"
#include "opencv2/video/video.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/ml/ml.hpp"
#include "opencv2/highgui/highgui_c.h"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/contrib/contrib.hpp"

#endif

四、命名规范约定

代码一定要规范!!!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五 、argc与argv参数疑惑(实际中不怎么使用)

(一)初识main函数中的argc和argv

arg指的是参数

  • ragc为证书,用来统计运行程序时送给main函数的命令行参数的个数;
  • *argv[]:为字符串数组,用来存放指向字符串参数的指针数组,每一个元素指向一个参数。
//官方最标准的main函数写法:
int main(int argc,char *argv[])
{
const char* imagename = argc > 1 ? argv[1] : "lena.jpg";
......
}

(二)argc,argv的具体含义

int main(int argc,char *argv[],char **env)

参数1:int类型的argc,为整型。用来统计运行程序时送给main函数的命令行参数的个数,在Visual Studio中默认值为1。
参数2:char*类型的argv[],为字符串数组,用来存放指向字符串参数的指针数组,各成员含义如下:

  • argv[0]指向程序运行的全路径名
  • argv[0]指向在DOS命令行中执行程序名后的第一个字符串
  • argv[0]指向执行程序名后的第二个字符串
  • argv[0]指向执行程序名后的第三个字符串
  • argv[argc]为NULL

参数3:char **类型的env,为字符串数组。很少用。

(三)Visual Studio中main函数的几种写法说明

1、【写法1】返回值为整型带参的main函数

int main(int argc,char** argv)
{
	//函数体内使用或不使用argc和argv都可行
	......
	return 1;
}

2、【写法2】返回值为整型不带参的main函数

int main(int argc,char** argv)
{
	//函数体内使用了argc或argv
	......
	return 1;
}

3、【写法3】返回值为void且不带参的main函数

int main()
{
	......
	return 1;
}

六 、格式输出函数printf()简析

(一)格式输出:printf()函数

int printf(const char *format,...);
即:
int printf("格式控制字符串",输出表列);

printf()函数用于指定输出格式。具体用法如下图所示:
在这里插入图片描述

在这里插入图片描述

(二)示例程序:printf函数的用法示例

示例:

#include <opencv2\opencv.hpp>
using namespace cv;

void main()
{
	int a = 66,b = 88;
	printf("\n\t%d,%d\n",a,b); //输出十进制整型
	printf("\n\t%06d,%06d\n",a,b); //输出6位十进制整型
	printf("\n\t%c,%c\n",a,b); //按字符输出
	printf("\n\t结果为:a=%d,b=%d",a,b); //可以配合其他内容一同输出
	getchar(); //等待输出任意字符结束
}

结果图:

在这里插入图片描述

七、智能显示当前使用的OpenCV版本

#include <opencv2\opencv.hpp>
using namespace cv;

int main()
{
	printf("\t当前使用的OpenCV版本为 OpenCV %s",CV_VERSION);
	getchar();
}

在这里插入图片描述

最后的最后,很喜欢书中的一句话:

授之以鱼,更授之以渔!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/584627.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sql优化常用的方法

文章目录 1、explain 输出执行计划2、in 和 not in 要慎用3、少用select *4、善用limit 15、 order by字段建索引6、count(*)推荐使用7、where 子句中避免is null /is not null8、应尽量避免在 where!或<>9、应尽量避免在 where 子句中使用 or10、尽量用union all代替uni…

了不起的互联网老男孩,在创业路上不掉队

“青春如同奔流的江河&#xff0c;一去不回来不及道别”&#xff0c;老男孩这首歌戳中了太多职场中年男人的心酸苦楚&#xff0c;面对经济下行压力、互联网行业变革以及中年职场危机&#xff0c;互联网人应该如何应对&#xff1f;如何建立和现实叫板的能力&#xff1f; 有2位在…

shiro入门实战

​​​​​​​Apache Shiro | Simple. Java. Security. java语言编写 架构 shiro认证流程 使用 添加shiro依赖 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.4.0</version>&l…

V2.0-在记事本功能上添加fork和wait

第一篇只是简单使用了open&#xff0c;read,write,lseek实现了基本的记事本功能&#xff1b; 但是当前的系统是linux&#xff0c;应该发挥他的多进程&#xff0c;多线程的作用&#xff1b; 所以&#xff0c;本篇添加创建子进程和父进程等待子进程退出的功能。 有几个注意点&a…

如何创建新一代Web3企业

日前&#xff0c;我们对话了Sui基金会的增长负责人Koh Kim&#xff0c;对如何成功构建持续发展的企业等话题展开讨论。 您在Sui基金会的工作重点帮助开发者&#xff0c;让他们从产品开发的早期阶段成长为强大且具有潜力的企业领导者。可以简单分享一下您为此目标创建的计划吗&…

Linux进程地址空间——下篇

目录 一.深入了解进程地址空间&#xff1a; 单个进程与进程地址空间与物理内存之间的联系图&#xff1a; 多个进程与进程地址空间与物理内存之间的联系图&#xff1a; 二.为什么会存在进程地址空间呢&#xff1f; 作用1&#xff1a;进程地址空间的存在&#xff0c;保证了其他…

Flutter 笔记 | Flutter 文件IO、网络请求、JSON、日期与国际化

文件IO操作 Dart的 IO 库包含了文件读写的相关类&#xff0c;它属于 Dart 语法标准的一部分&#xff0c;所以通过 Dart IO 库&#xff0c;无论是 Dart VM 下的脚本还是 Flutter&#xff0c;都是通过 Dart IO 库来操作文件的&#xff0c;不过和 Dart VM 相比&#xff0c;Flutte…

6.1 进程的创建和回收

目录 进程概念 程序 进程 进程内容 进程控制块 进程类型 进程状态 常用命令 查看进程信息 进程相关命令 进程的创建和结束 子进程概念 子进程创建-fork 父子进程 进程结束-exit/_exit 进程结束-exit-示例1 进程结束-exit-示例2 进程回收 进程回收-wait 进程回…

企业数字化转型,为什么会加快商业智能BI的发展

对于企业数字化转型来说&#xff0c;数据是其中提到最多的词汇。当今世界&#xff0c;随着人们认识到数据的重要性&#xff0c;明白了数据发挥价值的方式及其意义&#xff0c;数据资产就成为数字化转型企业需要掌握利用的关键。 数据可视化 - 派可数据商业智能BI可视化分析平台…

服务windows服务+辅助角色服务

1、vs2022新建一个windows服务项目 2、修改服务参数 &#xff08;1&#xff09;AutoLog: 是否将事件写入到windows的事件日志中。 &#xff08;2&#xff09;canpauseandContinue:服务是否可以暂停和继续 3、添加服务安装程序 在界面内右击鼠标 新建一个服务、新建后如下图&a…

【运维】speedtest测试

目录 docker 布署 布署云端 docker布署 云端放置于已有容器里 librespeed/speedtest: Self-hosted Speedtest for HTML5 and more. Easy setup, examples, configurable, mobile friendly. Supports PHP, Node, Multiple servers, and more (github.com) docker 布署 获取…

探讨生产环境下缓存雪崩的几种场景及解决方案

本文首发自「慕课网」&#xff08;www.imooc.com&#xff09;&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"或慕课网公众号&#xff01; 作者&#xff1a;大能 | 慕课网讲师 缓存我们经常使用&#xff0c;但是有时候我们…

如何撤消 Git 中最新的本地提交?

在使用Git进行版本控制时&#xff0c;有时我们可能会犯下错误或者想要撤销最新的本地提交。Git提供了一些强大的工具和命令&#xff0c;使我们能够轻松地撤消最近的提交并修复错误。 本文将详细介绍如何在Git中撤消最新的本地提交。 步骤1&#xff1a;查看提交历史 在撤消最新…

Centos7安装Java8(在线安装避坑详细安装)

开篇语&#xff1a; 喜欢在一个明媚阳光的午后 坐在那夕阳斑驳的南墙下 听着风起 闻着花香 望着远山 身边是你 如此便觉得很好 1.查看目前环境 rpm -qa|grep jdk在这里我们会发现&#xff0c;原有系统安装有jdk&#xff0c;如果对于jdk有要求&#xff0c;我们就需要重新安装jdk…

Liunx网络基础(3)传输层(TCP/UDP)可靠传输、字节流传输等

传输层协议 传输层协议解析: 负责两端之间的数据传输; TCP/ UDP 1. UDP UDP: 用户数据报协议&#xff0c;无连接&#xff0c;不可靠&#xff0c;面向数据报传输 重点: 协议格式&#xff0c;协议特性&#xff0c;特性对于编程的影响 协议格式&#xff1a; 16位源端口 & 16位…

2023-05-29 用 fltk gui库编写一个打字练习程序

用 fltk gui库编写一个打字练习程序 前言一、FLTK GUI 库二、使用步骤1.引入库2.使用代码 总结 前言 给孩子练习键盘打字, 发现终端还是欠点意思, 研究了一下gui, 最终用 fltk库弄了一个. 对于没有接触过gui的人, 发现, 编程的逻辑和终端区别很大, 很繁琐, 可能需要适应适应,…

Windows远程Centos7图形化界面

一、centos7服务器安装tigervnc 1、更新yum源 yum update 2、安装tigervnc yum -y install tigervnc* 3、启动vnc vncserver &#xff08;1&#xff09;执行命令后需要输入密码 &#xff08;2&#xff09;再次输入密码 注意&#xff1a;密码一定要记住&#xff0c;方便以…

链表反转方法汇总

反转范围之前有节点&#xff0c;prev就指向该节点&#xff0c;没有就prevnull&#xff1b; 一、头插法 class Solution {public ListNode reverseList(ListNode head) {ListNode header new ListNode(-1);ListNode cur head;while(cur ! null) {ListNode tmp cur.next;cur.…

LabVIEWCompactRIO 开发指南第六章41 同步模块

同步模块 同时运行的模块每个通道有一个ADC&#xff0c;并且采集数据时通道之间没有明显的偏差。同步模块的两个子类别&#xff0c;按需和三角积分&#xff0c;通过SPI总线传输数据&#xff0c;并受到其他SPI总线模块的所有规格和挑战的约束。 按需转换 表6.1.具有按需转换的…

Postgresql源码(104)子连接提升过程pull_up_sublinks

1 场景构造 drop table student; create table student(sno int primary key, sname varchar(10), ssex int); insert into student values(1, stu1, 0); insert into student values(2, stu2, 1); insert into student values(3, stu3, 1); insert into student values(4, st…