用C++开发 安装环境:Windows8 安装的OpenCV版本:OpenCV3.3 安装所需的其他软件:VS2015 用Python开发 使用命令: pip install opencv-contrib-python...-i https://pypi.tuna.tsinghua.edu.cn/simple 安装成功后测试: import cv2 print("--------- Test OpenCV ------...Python开发OpenCV例子
前言 kmeans算法主要用来实现自动聚类,是一种非监督的机器学习算法,使用非常广泛。在opencv3.0中提供了这样一个函数,直接调用就能实现自动聚类,非常方便。...浮点型的矩阵,每行为一个样本。 ---- k: 取成几类,比较关键的一个参数。 ---- bestLabels: 返回的类别标记,整型数字。...---- criteria: 算法结束的标准,获取期望精度的迭代最大次数 ---- attempts: 判断某个样本为某个类的最少聚类次数,比如值为3时,则某个样本聚类3次都为同一个类,则确定下来。...---- 代码演示 我们再新建一个项目名为opencv--kmeans,按照配置属性(VS2017配置OpenCV通用属性),然后在源文件写入#include和main方法. ?...获取源图像的宽度,高度以及颜色的通道数 ? 定义KMeans方法用到的初始值 ? 将源图上的RGB数据转换为样本数据 ? 运行KMeans进行图像分割 ? 将分割结果重新绘制到新的Mat里 ?
今天分享一个OpenCV检测轮廓极点实例,原图如下,我们需要检测出地图中最大轮廓的上下左右四个极点,并进行标注显示。 ? 第一步:阈值处理分割出地图轮廓 ?...第二步:轮廓筛选,找到我们需要的轮廓 第三步:计算对应轮廓的极点坐标并标注 Python OpenCV源码与效果图如下: import numpy as np import cv2...=(0, 255, 0), textSize=20): left, top = pt[0], pt[1] if (isinstance(img, np.ndarray)): #判断是否OpenCV...C++ OpenCV核心代码如下: box[i] = minAreaRect(Mat(contours[i])); //计算每个轮廓最小外接矩形 if (box[i].size.width < 50
方法一:直接使用已知的cookie访问 特点: 简单,但需要先在浏览器登录 原理: 简单地说,cookie保存在发起请求的客户端中,服务器利用cookie来区分不同的客户端。...:模拟登录后再携带得到的cookie访问 原理: 我们先在程序中向网站发出登录请求,也就是提交包含登录信息的表单(用户名、密码等)。...:模拟登录后用session保持登录状态 原理: session是会话的意思。...在Python中可以使用Selenium库来调用浏览器,写在代码里的操作(打开网页、点击……)会变成浏览器忠实地执行。...3.考虑如何在程序中找到上述元素 Selenium库提供了find_element(s)_by_xxx的方法来找到网页中的输入框、按钮等元素。
有时候我们需要把一批互相关联的API用不同的类提供给用户,以便简化每个类的使用难度。但是这样这些类之间的数据共享就成了问题。...JAVA的内部类可以自由的访问外围类的所有数据,所以很时候做这的工作,而如果C++也这样做,就变成要增加很多setter和getter。...但是,也可以用以下方法模拟实现: 首先,你的内部类头文件一般是被外围类所#include的,所以需要在内部类的声明前增加“前置声明”: namespace outerspace{ class OuterClass...; } 然后,再设置一个指向外部类的指针: private: OuterClass* outer_obj; 最后,让外部类是内部类的友元: friend outerspace::OuterClass;...在设计API的过程中,内部类需要用到外部类任何成员,包括是private的,都可以用 outer_obj->XXX直接引用。而外部类则可以直接返回内部类的指针(引用)给使用者。
python scrapy模拟登录的方法 1、requests模块。直接携带cookies请求页面。 找到url,发送post请求存储cookie。...找到相应的input标签,输入文本,点击登录。 3、scrapy直接带cookies。 找到url,发送post请求存储cookie。..., response.body.decode())) 以上就是python scrapy模拟登录的方法,希望对大家有所帮助。...更多Python学习指路:python基础教程 本文教程操作环境:windows7系统、Python 3.9.1,DELL G3电脑。 收藏 | 0点赞 | 0打赏
目录 方法一:直接使用已知的cookie访问 方法二:模拟登录后再携带得到的cookie访问 方法三:模拟登录后用session保持登录状态 方法四:使用无头浏览器访问 原文网址:https://www.cnblogs.com...:模拟登录后再携带得到的cookie访问 原理: 我们先在程序中向网站发出登录请求,也就是提交包含登录信息的表单(用户名、密码等)。...:模拟登录后用session保持登录状态 原理: session是会话的意思。...在Python中可以使用Selenium库来调用浏览器,写在代码里的操作(打开网页、点击……)会变成浏览器忠实地执行。...模拟登录的几种方法(转)
sudo apt-get install pkg-config 二、编译安装过程 至于为什么编译还是先看看这个: g++编译运行c++代码流程以及动态库静态库的创建与使用...install安装 sudo make install 三、配置lib库路径以及环境变量 1 配置lib库路径 配置lib库是为了能让编译你自己写的c...五、Python使用opencv 1 先用which python找到python的安装目录(每个人的不同,可以自行更改),只需要把opencv编译的cv2.so和原始的cv.py拷贝到python.../python/src2/cv.py ENV/lib/python2.7/site-packages/ 有的也是复制到这,因为python安装的位置不同 /usr/local/lib.../python2.7/site-packages 2 测试python例子 在opencv_dir/samples/python2可以找到python的测试用例,同理可以运行那些绿色的可执行文件
良好的特征不受光线、噪点、几何形变的干扰,图像识别技术的发展中,不断有新的描述图像特征提出,而图像不变矩就是其中一个。...OpenCV中的矩主要包括以下几种:空间矩,中心矩和中心归一化矩。...根据这个特性可以根据面积的符号来确定轮廓的位置。如果是默认值false,则面积以绝对值的形式返回....---- 代码演示 新建一个项目opencv-0026,配置属性(VS2017配置OpenCV通用属性),然后在源文件写入#include和main方法 ?...其中命令行里面显示每个轮廓的面积和周长,右边的画的轮廓里面还有每个轮廓的质心 ---- -END-
学更好的别人, 做更好的自己。...,就不太想碰Python的东西,然而现实就是这么无情的打脸,现在还是装上这些东西了,当然因为装Anaconda、Cuda、Cudnn这些,也是狠了狠心把Unity3D给卸载了。...上在四张图,最左边的是原图,第二张是通过边缘检测加双边滤波生成的,第三张是OpenCV自带函数(风格化滤波器)stylization生成,最后一张也是OpenCV自带函数(素描滤波器)pencilSketch...Canny检测的边缘连续性更好,轮廓也更清晰。Laplacian方法噪声抑制效果要更好。所以选择Laplacian的还是比较多,不过我这张照使用的效果感觉Canny更合适。 ?...最终图像生成的样式可以根据后两个参数的调整自己试一下。
前言 接:C++ —— 关于vector-CSDN博客 https://blog.csdn.net/hedhjd/article/details/142334349?...位置就会失效,也就是迭代器失效,就相当于成为了野指针,解决方法是将扩容之前的位置记录下来在扩容后更新pos的位置 //在指定位置插入数据 void insert(iterator pos, const...在迭代器区间构造的函数时可以使用函数模版,这样可以使用任意容器的迭代器初始化,例如链表 //迭代器区间 // 类模板的成员函数,还可以继续是函数模版 //加上一个模板那么迭代器就可以是任意类型的迭代器...使用memcpy拷贝问题 memcpy拷贝问题的问题其实就是浅拷贝的原因 浅拷贝就是两个指针指向同一块空间,如果一个指针对该空间进行释放或者其他操作就会影响另一个指针导致内存泄漏等问题 所以最好使用深拷贝让两指针指向不同的空间然后使其数据保持一致...,所以可以直接用 T* tmp = new T[n]; //将旧空间里的数据拷贝给新空间 //将 _start指向的size() * sizeof(T)空间里的数据拷贝到临时变量
1.list 底层 list为任意位置插入删除的容器,底层为带头双向循环链表 begin() 代表第一个结点,end()代表最后一个结点的下一个 2. list的模拟实现 1. list_node 类设计...list_node { list_node* _next; list_node* _prev; T _data; }; C+...迭代器的实现 若在数组上有一个int类型的指针,解引用是int类型的数据,再++可以加载下一个位置,因为物理空间是连续的 ---- 同样若在链表上,解引用类型为 node,再++不能到下一个节点,因为物理空间不连续...} 在list类中实现begin()和end(),内部调用_list_node类的构造函数 ---- const迭代器 假设第一个代表的是T * ,而第二个代表的 T * const...来达到交换的目的 13.
前言 接C++ —— 关于string类-CSDN博客 https://blog.csdn.net/hedhjd/article/details/142023625?...* _str:指向字符串存放的空间的指针 _size:当前存储的有效数据个数 ,指向最后一个字符的下一个位置 _capacity:代表当前可存储的最大容量 nops:此值设置为 -1,无符号整型转换就是...的字符串 //_str:指向字符串存放的空间的指针 //_size:当前存储的有效数据个数, 指向最后一个字符的下一个位置 void string::erase(size_t pos, size_t len..._str的地址就是我们要找的字符串的起始位置的下标 return ptr - _str; } } 通过strstr函数来将str作为子串找到它的地址,然后sub的地址减去_str的地址就是我们要找的字符串的起始位置的下标...len的字符串 //_str:指向字符串存放的空间的指针 //_size:当前存储的有效数据个数, 指向最后一个字符的下一个位置 void string::erase(size_t pos, size_t
的模拟实现 为了模拟实现vector,所以使用自己的名空间包含vector类 ---- 1....的大小时,由于size里面的_start改变了,所以需要提前储存原来的size 3....,但若为自定义类型依旧会报错 因为自己实现的拷贝构造中memcpy也是一种浅拷贝(按字节拷贝) 深拷贝是重新开辟一块与原空间大小相同的新空间,并将原空间的数据拷贝给新空间,但是若为string 类型..., 再次使v1析构,依旧会析构字符串,所以会报错 属于深拷贝内的浅拷贝 ---- 这样v1与v2中的_str都指向自己的字符串,不会发生析构两次的问题了 ---- 同样reserve也存在使用memcp...造成浅拷贝的问题 将旧空间上的_str等拷贝到新空间上,释放旧空间就导致_str所指向的字符串析构 ---- 当新空间析构时,_str所指向的字符串就会造成二次析构,从而报错 ---- ----
1、list的模拟实现 1.1 list简单介绍 list是带头双向循环链表,它与我们之前学习的string和vector的最大区别是物理结构不同,string和vector在逻辑上和物理上都是连续的,...,而end()是指向哨兵位的迭代器 1.2.7 迭代器失效的问题 对于list的迭代器,插入操作不会使迭代器失效,因为list的迭代器指向某一个节点,插入一个节点不会改变迭代器的指向。...虽然我们对list的迭代器进行了封装,但其核心还是指向节点的指针。 list迭代器的成员变量是指向节点的指针。...迭代器笼统的说就是指针,其作用是遍历数据,所以其指向是需要改变的,const iterator表示的是迭代器的指向不能改变,而const_iterator表示的才是迭代器指向的内容不能改变。...2、list模拟实现完整代码 list.h: #pragma once #include #include using namespace std; namespace
string底层是一个字符数组 为了跟库里的string区别,所以定义了一个命名空间 将string类包含 1. string的模拟实现 1.构造函数 #pragma once #include<iostream...---- s2与s3发生浅拷贝,导致两个指针都指向同一块空间,一个修改会影响另一个,会析构两次空间 ---- 深拷贝 创建一块同样大小的空间,并将原来的数据拷贝下来,这样就是s2与s3指向各自的空间..._size += len; } 通过reserve类似扩容的操作,扩大了字符串长度的空间,并且在原字符串'\0'的位置开始拷贝str字符串 11....流提取 >> 输入多个值,C++规定 空格/换行是值与值之间的区分 istream& operator>>(istream& in, string& s)//>> {/...对象中有值存在时,需要先使用clear清空,再输入新的数据 为了避免频繁扩容,使用一个128的字符数组接收,若输入的数据比128小,跳出循环将数组中的数据传给string类s,若输入的数据比128大,则将字符数组整体传给
模拟实现的节奏比较快,大家可以先去看看博主的关于string的使用,然后再来看这里的模拟实现过程 C++:String类的使用-CSDN博客 String模拟实现大致框架迭代器以及迭代器的获取...(*this == s); } 有了[ ]、迭代器,我们可以展示3种遍历方法:下标访问、迭代器区间访问、范围for访问 void Print(const string& s) { //下标遍历...= '\n') { //原始方法,一个字符一个字符加太麻烦,先用一个数组存起来,再一起加 //s += ch; buff[i++] = ch; if (i == 127)...,以空间换时间 七、string模拟实现全部代码 namespace cyx { using std::endl; using std::cout; class string { public...= 0) { buff[i] = '\0'; s += buff; } return in; } //遍历方法的展示 void Print(const string& s
Vector虽然也支持下标访问,但是很多成员函数都是用的迭代器,所以我们要模拟实现的话迭代器十分重要,vs使用的是PJ版的STL版本,比较难懂,所以我们模拟实现统一用SGI版本去实现,所以在模拟实现之前...通过这个我们可以观察到SGI版本下的迭代器其实就是一个原生指针,value_type*类型相当于是模板T对应的指针类型,有了这些大致了解,我们就可以去模拟实现啦!!...二,vector的模拟实现 大致框架需要有模板(类外定义)/迭代器以及迭代器的获取(public定义,要有可读可写的也要有可读不可写的)/成员变量(private定义) 并且为了不和库的vector...可读不可写) const T& operator[](size_t pos) const { assert(pos < size()); return _start[pos]; } 3.三种访问方法..._start = temp; _finish = _start + sz; _end_of_storage = _start + sz; } 2.5 反向迭代器 这里博主直接上代码,等list模拟实现的时候再放在一起分析
[删除自动创建的文件] 删除后,记得要在C/C++》预编译头 中取消使用预编译头 [取消使用预编译头] 1.3 配置OpenCV环境 这一步可参靠我的另一篇文章《OpenCV 3.2.0 + opencv_contrib...[添加包含目录和库目录] [添加附加依赖项] 2 编写调用OpenCV的C代码 创建MyDLL.cpp文件,输入如下代码: #include opencv2/imgproc/imgproc.hpp...3 编译生成DLL 执行 [编译生成DLL] 在项目目录中可以找到生成的DLL文件 [生成的DLL文件] 4 编写Python代码 创建Python文件,输入如下代码: import cv2 from...文件拷贝到python代码根目录,并加入测试图片input.jpg,示例如下。...[输出结果] 6 源码 https://github.com/huachao1001/blog/tree/master/python_cpp_opencv
最近在重构人脸识别的项目,通过opencv打开本地摄像头识别面部的时候,发现非常的卡。查了一些资料,有说是帧率的问题,我重新设置了一下帧率,毫无作用。...记得以前在运行目标检测方面的时候,也遇到过此类的问题,当时的解决方案就是通过opencv官网下载没有编译过的版本在本地进行编译,编译完成后再运行就不卡了,因为我电脑上另一个系统ubuntu是编译过的,索性就将代码丢在...下载地址:https://opencv.org/releases/ 点击Sources进行下载自己需要的版本 PART 02 安装 1.解压文件 解压后,将文件夹放自己喜欢的地方,笔者这里就放在了...home下 2.进入到解压后的文件夹下 (这里我将解压后的文件夹重新命为opencv3,这个随便,不是重点) 在opencv3文件夹下新建build文件夹 mkdir build 进入build文件夹下...--modversion 至此opencv的安装就完成了。