![](https://img-blog.csdnimg.cn/20190918140129601.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
OpenCV
OpenCV一些常见算子的原理和实现
https://github.com/taifyang/OpenCV-algorithm
OpenCV官网文档:
https://docs.opencv.org/4.x/d9/df8/tutorial_root.html
https://docs.opencv.
给算法爸爸上香
爱学习的图像算法工程师一枚
展开
-
图像引导滤波
【代码】图像引导滤波。原创 2023-06-02 18:34:29 · 128 阅读 · 0 评论 -
SIFT描述子实现
参考:SIFT图像匹配原理及python实现(源码实现及基于opencv实现)结果:另一种实现,参考:opencv实战:SIFT的实现这种实现比上面的实现方式更简略,主要差异在于把构建尺度空间以及生成极值点直接用Harris角点代替。结果:原创 2023-05-08 23:07:09 · 470 阅读 · 1 评论 -
OpenCV中的ROI问题
赋值运算符,只是将img2 指向img1(修改img2 的时候会同时改变img1)。img2 会重新分配内存,内容为img1(修改img2 的时候不改变img1)。当img1和img2具有相同的类型和大小时,只拷贝数据,内存地址不变。运行结果:(不修改原图像素值)运行结果:(不修改原图像素值)运行结果:(修改原图像素值)运行结果:(修改原图像素值)原创 2023-05-08 22:46:29 · 511 阅读 · 0 评论 -
ORB描述子实现
【代码】ORB描述子实现。原创 2023-05-08 23:06:45 · 360 阅读 · 0 评论 -
BRIEF描述子实现
【代码】BRIEF描述子实现。原创 2023-05-08 22:17:43 · 369 阅读 · 0 评论 -
OpenCV车牌识别
需要安装tesseract来识别文字。参考:b站某视频教程。原创 2023-05-07 00:49:40 · 316 阅读 · 0 评论 -
OpenCV图像拼接
这里结果和本文开头给出的链接相比,基本上完全消除了图像拼接的裂缝,并且去除了黑边。原创 2023-05-07 00:42:05 · 715 阅读 · 1 评论 -
传统图像处理方法实现车辆计数
本文通过传统OpenCV图像处理方法实现单向行驶的车辆计数。用于车辆检测的视频是在[https://www.bilibili.com/video/BV1uS4y1v7qN/?spm_id_from=333.337.search-card.all.click](https://www.bilibili.com/video/BV1uS4y1v7qN/?spm_id_from=333.337.search-card.all.click)里面下载的。原创 2023-03-03 23:00:45 · 1852 阅读 · 1 评论 -
OpenCV只含基本图像模块编译
编译OpenCV4.5.5只含基本图像模块,环境为Windows10 x64+CMake3.23.3+VS2019。默认编译选项编译得到的OpenCV库往往大几百MB甚至上GB,本文配置下编译得到的库压缩后得到的zip包大小仅6.25MB,适合使用OpenCV基本图像功能模块的项目移植而不牵涉其他模块。原创 2023-02-24 21:27:09 · 1477 阅读 · 0 评论 -
OpenCV-Python常用操作速查
安装:pip install opencv-python。绘制矩形,圆形,直线等不同的形状。导入:import cv2。原创 2022-11-06 19:01:52 · 614 阅读 · 0 评论 -
图像灰度变换--灰度反转 对数变换 分段线性变换 伽马校正
【代码】图像灰度变换--灰度反转 对数变换 分段线性变换 伽马校正。原创 2023-01-09 22:37:36 · 365 阅读 · 0 评论 -
图像几何变换--缩放 旋转 偏移
【代码】图像几何变换--缩放 旋转 偏移。原创 2023-01-09 22:35:49 · 230 阅读 · 0 评论 -
连通域的面积和周长计算实现
测试图片为一张640 * 480的全黑图片,中间有两个大小分别为100 * 100和150 * 150的白色方块。原创 2022-12-30 23:20:02 · 648 阅读 · 0 评论 -
FAST角点检测实现
【代码】FAST角点检测实现。原创 2022-12-28 21:36:40 · 149 阅读 · 0 评论 -
SUSAN角点检测实现
【代码】SUSAN角点探测实现。原创 2022-12-27 13:28:59 · 462 阅读 · 0 评论 -
shi-Tomas角点检测实现
【代码】shi-Tomas角点检测实现。原创 2022-12-25 23:37:16 · 169 阅读 · 0 评论 -
Harris角点检测实现
【代码】harris角点检测实现。原创 2022-12-25 23:30:48 · 162 阅读 · 0 评论 -
fitLine实现
原理参考:直线拟合——最小二乘法、hough变换#include <iostream>#include <opencv2/opencv.hpp>using namespace std;using namespace cv;void fitline(std::vector<cv::Point>& points, cv::Vec4f& line_para){ int N = points.size(); if (N < 2) retu原创 2022-04-26 12:44:20 · 2859 阅读 · 0 评论 -
resize图像插值算法实现
这篇博文在写之前参考了网上的不少文章,感觉有的文章讲解比较到位,有的会误导人。下面的代码运行结果已经和直接调用opencv算子进行对比确保结果相同,就没有深究其开源代码了。不过根据推断,opencv在实现resize图像插值时(1)需要做像素点中心对齐操作(2)不需要做copyMakeBorder边缘复制操作。原理参考:【图像处理】详解 最近邻插值、线性插值、双线性插值、双三次插值其中双三次插值的实现参考了:C++ OpenCV实现图像双三次插值算法详解这篇文章原理讲的比较细,但代码实现有瑕疵。最近邻原创 2022-04-09 12:17:02 · 3898 阅读 · 2 评论 -
matchTemplate实现
原理见opencv学习(三十八)之图像模板匹配matchTemplate()下面是平方差匹配法CV_TM_SQDIFF的自己实现:void matchtemplate(Mat& src, Mat& temp, Mat& dst){ for (int i = 0; i < dst.cols; ++i) { for (int j = 0; j < dst.rows; ++j) { int R = 0; for (int m = 0; m <原创 2022-04-07 13:34:53 · 3575 阅读 · 0 评论 -
boundingRect实现
Rect boundingrect(Mat& img){ Rect rect(0, 0, 0, 0); bool flag = false; for (size_t i = 0; i < img.cols; ++i) { for (size_t j = 0; j < img.rows; ++j) { if (img.at<uchar>(j, i)) { rect.x = i; flag = true; break;原创 2022-04-02 12:51:19 · 627 阅读 · 0 评论 -
骨架细化算法实现
原理:实现:void thinImage(Mat& src, Mat& dst, const int maxIterations = -1){ dst = src.clone(); Mat mid = src.clone();; int count = 0; //记录迭代次数 while (true) { count++; if (maxIterations != -1 && count > maxIterations) //限制次数并且迭原创 2021-06-15 17:17:44 · 1059 阅读 · 1 评论 -
连通域标记算法实现
原理:1.从左到右,从上到下遍历每一个像素点,然后判断该像素的值是否在集合V中(这里是一张二值图,我们假设黑色的值为0)。2.如果遇到一个值为0的点,说明在该点附近可能存在与该点相连通的像素点,即可能存在连通域。那么我们就暂时停止之前的遍历,开始以该点为种子点,查找该点附近的邻域中是否存在与其连通的像素点,若与该点连通,则将其存到一个堆栈中,并将该点的标签赋值为与种子点相同的标签,并对访问过的像素点置一个表示已访问的标志,以避免后面对其重复访问。3.接下来就从堆栈中取出点,查看该点的四邻域,依次把和该原创 2021-06-15 15:54:12 · 1723 阅读 · 4 评论 -
区域生长算法实现
原理:实现:void regiongrow(Mat& src, Mat& dst, cv::Point pt, int threshold){ Point ptGrowing; //待生长点位置 int srcval = src.at<uchar>(pt.y, pt.x); //起始生长点灰度值 dst = Mat::zeros(src.size(), CV_8UC1); //创建一个空白区域,填充为黑色 in原创 2021-06-14 22:30:24 · 474 阅读 · 0 评论 -
HoughLines霍夫变换实现
原理:实现:void hough(Mat& edge, vector<Vec2f>& lines, int threshold){ Mat H = Mat::zeros(2 * edge.rows + 2 * edge.cols, 180, CV_16S); float theta, rho; for (int i = 0; i < edge.rows; i++) { for (int j = 0; j < edge.cols; j++)原创 2021-06-14 20:20:25 · 223 阅读 · 0 评论 -
equalizeHist直方图均衡化实现
原理:直方图均衡化算法原理与实现实现:void equalizehist(Mat &src, Mat &dst){ dst.create(src.size(), src.type()); // 计算直方图 int histogram[256] = { 0 }; int totalnum = src.rows*src.cols; uchar *data = src.data; for (int i = 0; i < totalnum; ++i) { ++his原创 2021-06-14 20:04:13 · 516 阅读 · 0 评论 -
DOG算子实现
原理:实现:void dog(Mat& src, Mat& dst, Size size, double sigma, double k = 1.6){ Mat gaussian_dst1, gaussian_dst2; GaussianBlur(src, gaussian_dst1, size, k*sigma); GaussianBlur(src, gaussian_dst2, size, sigma); dst = gaussian_dst1 - gaussian_ds原创 2021-06-13 14:26:59 · 364 阅读 · 0 评论 -
LOG算子实现
原理:实现:void log(Mat& src, Mat& dst){ Mat kernel = (Mat_<float>(5, 5) << 0, 0 ,-1, 0, 0, 0, -1, -2, -1, 0, -1, -2, 16, -2, -1, 0, -1, -2, -1, 0, 0, 0, -1, 0, 0); filter2D(src, dst, src.depth(), kernel);}原创 2021-06-13 14:25:43 · 841 阅读 · 0 评论 -
canny算子实现
原理:实现://阶乘int factorial(int n){ int fac = 1; if (n == 0) return fac; for (int i = 1; i <= n; ++i) fac *= i; return fac;}//获得Sobel平滑算子Mat getSobelSmooth(int size){ int n = size - 1; Mat SobelSmoothoper = Mat::zeros(size, 1, CV_32F); fo原创 2021-06-13 14:19:16 · 297 阅读 · 0 评论 -
sobel算子实现
原理:实现://阶乘int factorial(int n) { int fac = 1; if (n == 0) return fac; for (int i = 1; i <= n; ++i) fac *= i; return fac;}//获得Sobel平滑算子Mat getSobelSmooth(int size) { int n = size - 1; Mat SobelSmoothoper = Mat::zeros(size, 1, CV_32F); fo原创 2021-06-13 14:10:35 · 599 阅读 · 0 评论 -
prewitt算子实现
原理:实现:void prewitt(Mat& src, Mat& dst) { //获取Prewitt算子 Mat getPrewitt_horizontal = (Mat_<float>(3, 3) << -1, -1, -1, 0, 0, 0, 1, 1, 1); //水平方向 Mat getPrewitt_vertical = (Mat_<float>(3, 3) << -1, 0, 1, -1, 0, 1, -1, 0,原创 2021-06-13 14:08:08 · 1111 阅读 · 0 评论 -
roberts算子实现
原理:实现:void roberts(Mat& src, Mat& dst) { Mat oper1 = (Mat_<float>(2, 2) << 0, 1, -1, 0); //45°方向 Mat oper2 = (Mat_<float>(2, 2) << 1, 0, -1, 0); //135°方向 flip(oper1, oper1, -1); flip(oper2, oper2, -1); Mat dst1, ds原创 2021-06-13 14:05:01 · 457 阅读 · 0 评论 -
blackhat黑帽实现
原理:实现:void blackhat(Mat& src, Mat& dst, Size size){ Mat element = getStructuringElement(MORPH_RECT, Size(3, 3)); morphologyEx(src, dst, MORPH_CLOSE, element); dst = dst - src;}原创 2021-06-13 11:58:42 · 208 阅读 · 0 评论 -
tophat顶帽运算实现
原理:实现:void tophat(Mat& src, Mat& dst, Size size){ Mat element = getStructuringElement(MORPH_RECT, Size(3, 3)); morphologyEx(src, dst, MORPH_OPEN, element); dst = src - dst;}原创 2021-06-13 11:58:34 · 632 阅读 · 0 评论 -
gradient形态学梯度实现
原理:实现:void gradient(Mat& src, Mat& dst, Size size){ Mat element = getStructuringElement(MORPH_RECT, size), dst1, dst2; dilate(src, dst1, element); erode(src, dst2, element); dst = dst1 - dst2;}原创 2021-06-12 20:34:44 · 180 阅读 · 0 评论 -
close闭运算实现
原理:实现:void close(Mat& src, Mat& dst, Size size){ Mat element = getStructuringElement(MORPH_RECT, size); dilate(src, dst, element); erode(dst, dst, element);}原创 2021-06-12 17:24:00 · 400 阅读 · 0 评论 -
open开运算实现
原理:实现:void open(Mat& src, Mat& dst, Size size){ Mat element = getStructuringElement(MORPH_RECT, size); erode(src, dst, element); dilate(dst, dst, element);}原创 2021-06-12 17:22:55 · 217 阅读 · 0 评论 -
erode腐蚀实现
原理:实现:void Erode(Mat& src, Mat& dst, Size size){ dst = Mat::zeros(src.size(), src.type()); Mat mid; int h = (size.height - 1) / 2, w = (size.width - 1) / 2; copyMakeBorder(src, mid, h, h, w, w, BORDER_DEFAULT); for (int i = h; i < src.r原创 2021-06-12 14:12:11 · 304 阅读 · 0 评论 -
dilate膨胀实现
原理:实现:void Dilate(Mat& src, Mat& dst, Size size){ dst = Mat::zeros(src.size(), src.type()); Mat mid; int h = (size.height - 1) / 2, w = (size.width - 1) / 2; copyMakeBorder(src, mid, h, h, w, w, BORDER_DEFAULT); for (int i = h; i < src.r原创 2021-06-12 14:09:36 · 348 阅读 · 0 评论 -
adaptiveThreshold自适应阈值实现
enum adaptiveMethod { meanFilter, gaaussianFilter, medianFilter };void adaptivethreshold(cv::Mat& src, cv::Mat& dst, int size, double c, adaptiveMethod method = meanFilter) { Mat smooth; switch (method) { case meanFilter: blur(src, smoot.原创 2021-06-11 23:11:17 · 265 阅读 · 0 评论