基于opencv-pyhton与opencv-c++的结合理解与学习
2023年上半年,一直在学习opencv-c++版本,学习了其中的多个库函数
笔记链接:https://www.cnblogs.com/Tan-code/category/2339311.html
- opencv-python 读取图片,画圆等基本操作 :
- opencv-c++ 多个库函数:
- opencv-python与opencv-c++ 结合理解:
结合两段代码来比较实现:
# 导入所需模块
import cv2
from matplotlib import pyplot as plt
import os
import numpy as np
# plt显示彩色图片
def plt_show0(img):
#cv2与plt的图像通道不同:cv2为[b,g,r];plt为[r, g, b]
b,g,r = cv2.split(img)
img = cv2.merge([r, g, b])
plt.imshow(img)
plt.show()
# plt显示灰度图片
def plt_show(img):
plt.imshow(img,cmap='gray')
plt.show()
# 图像去噪灰度处理
def gray_guss(image):
image = cv2.GaussianBlur(image, (3, 3), 0)
gray_image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
return gray_image
# 读取待检测图片
origin_image = cv2.imread('E:\opencv_practice\licenses.jpg')
# 复制一张图片,在复制图上进行图像操作,保留原图
image = origin_image.copy()
# 图像去噪灰度处理
gray_image = gray_guss(image)
# x方向上的边缘检测(增强边缘信息)
Sobel_x = cv2.Sobel(gray_image, cv2.CV_16S, 1, 0)
absX = cv2.convertScaleAbs(Sobel_x)
image = absX
# 图像阈值化操作——获得二值化图
ret, image = cv2.threshold(image, 0, 255, cv2.THRESH_OTSU)
# 显示灰度图像
#plt_show(image)
# 形态学(从图像中提取对表达和描绘区域形状有意义的图像分量)——闭操作
kernelX = cv2.getStructuringElement(cv2.MORPH_RECT, (30, 10))
image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernelX,iterations = 1)
# 显示灰度图像
#plt_show(image)
# 腐蚀(erode)和膨胀(dilate)
kernelX = cv2.getStructuringElement(cv2.MORPH_RECT, (50, 1))
kernelY = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 20))
#x方向进行闭操作(抑制暗细节)
image = cv2.dilate(image, kernelX)
image = cv2.erode(image, kernelX)
#y方向的开操作
image = cv2.erode(image, kernelY)
image = cv2.dilate(image, kernelY)
# 中值滤波(去噪)
image = cv2.medianBlur(image, 21)
# 显示灰度图像
#plt_show(image)
# 获得轮廓
contours, hierarchy = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
width,height = 600,350 #所需图像大小
for item in contours:
rect = cv2.boundingRect(item)
x = rect[0]
y = rect[1]
weight = rect[2]
height = rect[3]
# 根据轮廓的形状特点,确定车牌的轮廓位置并截取图像,否则提取不到车牌轮廓
if (weight > (height * 3.5)) and (weight < (height * 4)):
image = origin_image[y:y + height, x:x + weight]
# 将车牌图像进行透视变换,矫正为矩形形状
pts1 = np.float32([[0, 0], [weight, 0], [0, height], [weight, height]])
pts2 = np.float32([[0, 0], [width, 0], [0, height], [width, height]])
matrix = cv2.getPerspectiveTransform(pts1, pts2)
warped_image = cv2.warpPerspective(image, matrix, (width, height))
plt_show0(warped_image)
cv2.imwrite('E://RM24暑假考核//rect//licenses.jpg',warped_image)
这是c++版的:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
void plt_show0(Mat img) {
Mat bgr_img;
cvtColor(img, bgr_img, COLOR_RGB2BGR);
imshow("Image", bgr_img);
waitKey(0);
}
void plt_show(Mat img) {
imshow("Image", img);
waitKey(0);
}
Mat gray_guss(Mat image) {
Mat gray_image;
GaussianBlur(image, image, Size(3, 3), 0);
cvtColor(image, gray_image, COLOR_RGB2GRAY);
return gray_image;
}
int main() {
Mat origin_image = imread("E:\\opencv_practice\\licenses.jpg");
Mat image = origin_image.clone();
Mat gray_image = gray_guss(image);
Mat Sobel_x,absX;
Sobel(gray_image, Sobel_x, CV_16S, 1, 0);
convertScaleAbs(Sobel_x,absX);
image = absX;
threshold(image, image, 0, 255, THRESH_OTSU);
Mat kernelX = getStructuringElement(MORPH_RECT, Size(30, 10));
morphologyEx(image,image, MORPH_CLOSE, kernelX);
kernelX = getStructuringElement(MORPH_RECT, Size(50, 1));
Mat kernelY = getStructuringElement(MORPH_RECT, Size(1, 20));
dilate(image,image, kernelX);
erode(image, image,kernelX);
erode(image, image,kernelY);
dilate(image, image,kernelY);
medianBlur(image,image, 21);
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(image.clone(), contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
int width = 600;
int height = 350;
for (const auto& item : contours) {
Rect rect = boundingRect(item);
int x = rect.x;
int y = rect.y;
int weight = rect.width;
int height = rect.height;
if (weight > (height * 3.5) && weight < (height * 4)) {
image = origin_image(Rect(x, y, weight, height));
Mat pts1 = (Mat_<float>(4, 2) << 0, 0, weight, 0, 0, height, weight, height);
Mat pts2 = (Mat_<float>(4, 2) << 0, 0, width, 0, 0, height, width, height);
Mat matrix = getPerspectiveTransform(pts1, pts2);
Mat warped_image;
warpPerspective(image, warped_image, matrix, Size(width, height));
plt_show0(warped_image);
imwrite("E://RM24暑假考核//rect//licenses.jpg", warped_image);
}
}
return 0;
}
上面两段代码是关于框出车牌的
个人观点:
python代码中,是不会提前声明一个变量的,而是用的时候直接 img = ...
也就是说,绝大多数函数是有返回值的
而c++不同,许多函数 void function(InputArray,OutputArray,....) ,dstimg是直接写到API里的
但是有些函数还是有返回值的
像是代码中的:
Mat matrix = getPerspectiveTransform(pts1, pts2);
Rect rect = boundingRect(item);
这里还学到个新函数:
image = origin_image(Rect(x, y, weight, height));
这行代码是从原始图像(origin_image)中提取一个矩形区域(Rect)并保存到新的图像变量 image 中。Rect(x, y, width, height) 表示一个矩形,其中 (x, y) 是矩形的左上角坐标,width 是矩形的宽度,height 是矩形的高度。这样,origin_image(Rect(x, y, width, height)) 就表示从 origin_image 中裁剪出指定矩形区域的图像数据,并将其赋值给 image 变量。
基于opencv-pyhton与opencv-c++的结合理解与学习的更多相关文章
- OpenCV Tricks[OpenCV 笔记3]
官方例程 事例程序位于opencv-3.1.0/samples/cpp/ 目录下,可以通过编译整个工程,编译所有的Sample Code 显示当前使用的OpenCV版本 CV_VERSION为标识当前 ...
- VS2010下安装Opencv 分类: Opencv 2014-11-02 13:51 778人阅读 评论(0) 收藏
Opencv作为一种跨平台计算机视觉库,在图像处理领域得到广泛的应用,下面介绍如何在VS2010中安装配置Opencv 一.下载Opencv 下载网址:http://sourceforge.net/p ...
- ubuntu 16.04源码编译OpenCV教程 | compile opencv on ubuntu 16.04
本文首发于个人博客https://kezunlin.me/post/15f5c3e8/,欢迎阅读! compile opencv on ubuntu 16.04 Series Part 1: comp ...
- opencv滤镜-使用opencv实现各种图像滤镜特效
图像处理-滤镜 链接:https://mangoroom.cn/opencv/image-processing-filter.html opencv滤镜-实现晕影vignetting效果 链接:htt ...
- 分享《机器学习实战基于Scikit-Learn和TensorFlow》中英文PDF源代码+《深度学习之TensorFlow入门原理与进阶实战》PDF+源代码
下载:https://pan.baidu.com/s/1qKaDd9PSUUGbBQNB3tkDzw <机器学习实战:基于Scikit-Learn和TensorFlow>高清中文版PDF+ ...
- [OpenCV实战]17 基于卷积神经网络的OpenCV图像着色
目录 1 彩色图像着色 1.1 定义着色问题 1.2 CNN彩色化结构 1.3 从 中恢复彩色图像 1.4 具有颜色再平衡的多项式损失函数 1.5 着色结果 2 OpenCV中实现着色 2.1 模型下 ...
- 基于PI+QT实现OpenCV图像处理操作(基本环境搭建)
这篇博客就是在PI上直接写出来的!cheers!! PI3的性能已经非常强劲,而作为一个能够独立运行的运算单元,使用它来做图像处理,将是非常适合的.为了挖掘机器的最大潜能,我没有采用比较常见的pyth ...
- 基于Python3.7和opencv的人脸识别(含数据收集,模型训练)
前言 第一次写博客,有点紧张和兴奋.废话不多说,直接进入正题.如果你渴望使你的电脑能够进行人脸识别:如果你不想了解什么c++.底层算法:如果你也不想买什么树莓派,安装什么几个G的opencv:如果你和 ...
- [OpenCV实战]13 OpenCV中使用Mask R-CNN进行对象检测和实例分割
目录 1 背景介绍 1.1 什么是图像分割和实例分割 1.2 Mask-RCNN原理 2 Mask-RCNN在OpenCV中的使用 2.1 模型下载 2.2 模型初始化 2.3 模型加载 2.4 输出 ...
- [OpenCV实战]4 OpenCV中的颜色空间
目录 1 不同的色彩空间 1.1RGB颜色空间 1.2 Lab色彩空间 1.3 YCrCb颜色空间 1.4 HSV颜色空间 2 如何使用这些颜色空间进行分割 2.1 获取特定颜色的颜色值 2.2 应 ...
随机推荐
- 7-8 切分表达式——写个tokenizer吧 (20 分)
1.题目描述: [先说点出题背景] 这个题是为低年级同学.学C语言的同学准备的,因为,对这部分同学,这个题目编写起来略有一点复杂.如果是高年级.学过了正则表达式(Regular Expression) ...
- 03、SECS-I 协议介绍
03.SECS-I 协议介绍 上一篇我们学习了 SECS-II 协议,对 SECS-II 协议有了初略的了解,现在我们再来一起学习 SECS-I 协议. 文章的内容基本上来自参考资料和自己看的文档,若 ...
- 设置nginx允许服务端跨域
目前项目大多使用前后端分离的模式进行开发,跨域请求当然就是必不可少了,很多时候我们会使用在客户端的ajax 请求中设置跨域请求,也有的在服务端设置跨域.但是有时候会遇到不使用ajax也没有使用后端服务 ...
- python 学习 ---函数(带参数)
函数式编程最重要的是增强代码的重用性和可读性 1 def 函数名(参数): 2 3 ... 4 函数体 5 ... 函数的定义主要有如下要点: def:表示函数的关键字 函数名:函数的名称,日后根据函 ...
- Windows 安装ActiveMq5.16.6
Windows 安装ActiveMq5.16.6 前言 最近因为需要在项目中使用MQ,所以就想在我的老Windows机器上装个ActiveMq. 1. 下载安装 先到Activemq官网下载安装需要版 ...
- 效率神器,边看网页边问ChatGPT!神级ChatGPT插件(浏览器扩展)推荐!
如果在看一个网页时,有些词不认识.句子不知道含义,怎么办? 憨憨版:不认识就算了呗,还能咋滴 进阶版:复制到 Google/Baidu 里问一问: AI达人版:复制到 ChatGPT/Claude 里 ...
- 如何在 Python 中实现遗传算法
前言 遗传算法是一种模拟自然进化过程与机制来搜索最优解的方法,它由美国 John Holland 教授于20世纪70年代提出.遗传算法的主要思想来源于达尔文生物进化论和孟德尔的群体遗传学说,通过数学的 ...
- 创建springboot工程失败解决 spring initializr Error:cannot download
创建springboot工程失败解决 问题描述 原因分析: 网络不好,因为springBooT项目的创建时必须联网的 解决方案: 方案一: 将创建 springBoot 工程的地址更换为如下的地址 阿 ...
- React后台管理系统 02样式初始化,引入reset-css
上一篇中,我们已经对项目的整体结构进行了搭建,现在需要对不需要的东西进行删除,最后留下这些东西. 现在需要对全部的样式进行清除,使用命令导入依赖:npm i reset-css 然后在main.tsx ...
- 浅析synchronized锁升级的原理与实现
背景 在多线程编程中,线程同步是一个关键的概念,它确保了多个线程对共享资源的安全访问.Java中的synchronized关键字是一种常用的线程同步机制,它不仅提供了互斥访问的功能,还具备锁升级的特性 ...