OpenCV C++记录(十一):Mat数据规范化、灰度直方图与均衡算法
归一化
讨论归一化主要是图像数据分析中用到,cv::normalize支持将Mat数据归一化:
123456789void normalize( cv::InputArray src, cv::InputOutputArray dst, double alpha = (1.0), //归一化倍数/下限,根据类型不同而不同; double beta = (0.0), //无意义或归一化上限,根据类型不同而不同,见下文; int norm_type = 4, //默认L2范数,四种方式,cv::NORM_L1/cv::NORM_L2/cv::NORM_INF/cv::NORM_MINMAX int dtype = -1, //输出矩阵类型,-1保持和原矩阵一致 cv::InputArray mask = noArray() //位置掩图,如果对src某区域归一化传入同size的mask(对应roi置白))
这里重要的地方是norm_type对应几种规范化类型,分别是L1范数(平均值)、L2范数、最大值以及范围规范化。 ...
OpenCV C++记录(十):形态学处理基础
形态学处理
在传统图像处理中,形态学处理可算是最为强大的功能之一,只要你稍微有一些粗略的识别-分类需求需要对图像进行前处理,形态学都能帮上大忙,而且具备极高的计算效率。
这得益于其计算原理的简单,腐蚀和膨胀是两种基本操作,注意这里形态学处理的对象都是二值图;
腐蚀与膨胀
腐蚀的基本原理是以二值卷积核和二值图卷积,只要一个位置的相乘结果为0,那么中心像素即为0:
腐蚀基本运算
腐蚀函数原型是: 123456789void erode( cv::InputArray src, //输入二值图像 cv::OutputArray dst, //输出二值图像 cv::InputArray kernel, //卷积核 cv::Point anchor = cv::Point(-1, -1), //处理锚点,默认中心点 int iterations = 1, //腐蚀次数 int borderType = 0, //边值处理:默认常数填充 const cv::Scalar &borderValue = morphologyD ...
OpenCV C++记录(九):二值化与图像模糊(滤波)算法
二值化
全局阈值
将灰度图二值化是图像处理基本操作,比较简单: 1234567double threshold( InputArray src, //输入灰度图 OutputArray dst, //输出二值图 double thresh, //分割阈值 double maxval, //最大阈值,是否生效与类型相关 int type //二值化类型);
二值化类型包括:
THRESH_BINARY:普通二值化,像素大于thresh的设为maxval,其余为0;
THRESH_BINARY_INV:反二值化,像素大于thresh的设为0,其余为maxval;
THRESH_TRUNC:截断二值化,像素大于thresh设置为thresh,其余不变;
THRESH_TOZERO:零二值化,像素大于thresh则不变,其余为0;
THRESH_TOZERO_INV:反的零二值化,像素大于thresh设置为0,其余不变;
THRESH_OTSU:大津法,适用于双峰图像;
...
C++ Generic Programming:SFINAF与类型萃取
SFINAE
SFINAE(Substitution Failure IS Not An
Error)技术是模板引入的一种特性,替代失败不是错误,这种特性允许了模板中尽管发生不匹配也不会导致编译直接失败,而是由编译器继续去匹配其他类型,这是泛型编程得以实现基础;再者,它允许泛型更灵活地控制和管理各种数据类型行为,为萃取、特化做了铺垫。
任意的模板都体现了SFINAE,例如: 1234567891011121314151617181920212223#include <iostream>using namespace std;struct Test{ typedef int foo;};template<typename T> //#1void func(typename T::foo){ cout<<"void f(T::foo)"<< endl;}template<typename T> //#2void func(T){ cout ...
Modern C++ Design(第二章):Techniques
本文来自Modern C++ Design的第二章:技术,会记录以下技术内容:
Partial template specialization,模板偏特化
Local Classes,局部类
型别与数值间的映射性(Int2type Type2Type class templates)
编译期察觉可转换性和继承性
型别信息及一个容易上手的std::type_info外覆类(wrapper)
Select class template,编译器根据bool状态选择型别;
Traits,traits技术集合
2.1
编译期错误Compile-Time Assertions及定制的错误日志
(注:代码复现价值并不大,因为现在的编译器能直接检出reinterpret_cast的错误转换,报错日志和原书不同;)
考虑一段实现安全转型的代码: 12345678910111213141516#include <iostream>#include <assert.h>using namespace std;template <typename T ...
C++ Generic Programming:泛型编程
泛型编程
从普通模板开始
使用普通模板注意以下几点。
废弃的模板导出
对于模板成员函数,C++11后基本废弃了“模板导出”特性,即应该尽量将模板成员函数的声明和定义放在头文件(内联实现),而并非单独在源文件给出模板的实现,因为编译器的复杂性因此大大增加甚至不再支持;
自动推导
模板类型可以放在参数、返回值或者函数体内: 1234567891011121314#include <iostream>using namespace std;template<typename T1,typename T2, typename T3>T3 add(T1 a,T2 b){ return a+b;}int main(){ int a = 2; float b = 3.14; cout<<add<int,float,float>(a,b); return 0;}
上述例子缺省任意显式类型都会被报错,因为传统的template仅支持有限的类型推导,如下例子:此处a+b的类型 ...
读书笔记:Effective C++(第三版)
开始记录这本书的阅读笔记出自三个目的:
很多人说没读过Effective C++等于没学C++;
很难坚持以往想法-验证这种模式的学习,实在耗费精力,希望能在读书上仍然坚持下去;
希望这本书能缓解我写代码时对于安全性、规范和技巧上的惶恐不安。
本文的主题以及本书的副标题是改善程序设计的55个条款。值得一提是,本文不是大多数笔记那样的纯摘抄和摹写(实际上这种台湾翻译不太符合内地术语习惯,意义并不大,再者本书在C++
11以前出版,有许多语言特性和解决方案已经落后,在能力范围以内不指出是一种懒惰的阅读习惯。
持续更新。
条款01:View C++ as
a federation of languages.
视C++为一个语言联邦。
C++一开始是一种C with
Classes,但随着语言逐渐成熟,其开始引入各种编程战略,例如Exceptions(异常处理)、Templates(模板)、STL;今日的C++已经是多重范型编程语言(multiparadigm
programming
language),同时支持面向过程、面向对象、函数、泛型(generic) ...
Apply OpenCV In QtCreator:在Qt中使用OpenCV环境
一篇水文,部署没什么难度,环境变量重复包含居然会导致编译通过但无法在QtCreator运行,记录一下。
Qt的OpenCV环境部署
在此前一篇文章OpenCV
C++记录(一):基于MinGW的环境搭建我们使用了mingw通过cmake编译OpenCV
4.5.5,因为勾选了With
QT选项现在可以直接将OpenCV集成到Qt项目,仍然采用cmake管理。
自动关联路径
Qt的cmake可以通过find_package来自动搜索依赖包,我们只需要包含OpenCV的编译路径即可:
1234567891011121314151617181920212223242526272829cmake_minimum_required(VERSION 3.5)project(QtOpenCVtest)set(CMAKE_AUTOMOC ON)find_package(Qt5 COMPONENTS Core # Gui # Widgets REQUIRED)set(OpenCV_DIR "D:/opencv-4.5.5/build/install ...
Qt的Json序列化
Json的易用性使得它成为最常用的通信格式之一,本文记录了Qt中的Json封装和解析,包括QJsonDocument、QJsonObject、QJsonValue、QJsonArray类型;
QJson
直接看示例就会用了,一个示例json: 123456789101112131415{ "Company": "Digia", "From": "1991", "Name": "Qt", "Page": { "Developers": "https://www.qt.io/developers/", "Download": "https://www.qt.io/download/", "Home": "https://www.qt.io/" ...
Mat/QImage To Json:Mat/QImage类型的Json序列化
记录了cv::Mat的json序列化和反序列化过程,以及比对序列化反序列化前后的两个Mat矩阵是否对应。
Mat to json序列化
Mat是一种特殊的数据类型,如果使用vector再进行JsonArray序列化略微繁琐,且类型不同通道数通用性较差,一般习惯使用base64编码图像信息,首先通过cv::imencode函数进行编码(因为大多数图像是8位位深,故该函数仅支持CV_8U类型的编码);
12345678910111213141516bool cv::imencode(const std::string& ext, InputArray img, std::vector<uchar>& buf, const std::vector<int>& params = std::vector<int>())//参数:ext:png或者jpg,前者无损,后者有损;img:输入图像;buf:编码数组;params:png/jpg模式具体参数(可缺省),如: - std::vector<int& ...