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++的结合理解与学习的更多相关文章

  1. OpenCV Tricks[OpenCV 笔记3]

    官方例程 事例程序位于opencv-3.1.0/samples/cpp/ 目录下,可以通过编译整个工程,编译所有的Sample Code 显示当前使用的OpenCV版本 CV_VERSION为标识当前 ...

  2. VS2010下安装Opencv 分类: Opencv 2014-11-02 13:51 778人阅读 评论(0) 收藏

    Opencv作为一种跨平台计算机视觉库,在图像处理领域得到广泛的应用,下面介绍如何在VS2010中安装配置Opencv 一.下载Opencv 下载网址:http://sourceforge.net/p ...

  3. 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 ...

  4. opencv滤镜-使用opencv实现各种图像滤镜特效

    图像处理-滤镜 链接:https://mangoroom.cn/opencv/image-processing-filter.html opencv滤镜-实现晕影vignetting效果 链接:htt ...

  5. 分享《机器学习实战基于Scikit-Learn和TensorFlow》中英文PDF源代码+《深度学习之TensorFlow入门原理与进阶实战》PDF+源代码

    下载:https://pan.baidu.com/s/1qKaDd9PSUUGbBQNB3tkDzw <机器学习实战:基于Scikit-Learn和TensorFlow>高清中文版PDF+ ...

  6. [OpenCV实战]17 基于卷积神经网络的OpenCV图像着色

    目录 1 彩色图像着色 1.1 定义着色问题 1.2 CNN彩色化结构 1.3 从 中恢复彩色图像 1.4 具有颜色再平衡的多项式损失函数 1.5 着色结果 2 OpenCV中实现着色 2.1 模型下 ...

  7. 基于PI+QT实现OpenCV图像处理操作(基本环境搭建)

    这篇博客就是在PI上直接写出来的!cheers!! PI3的性能已经非常强劲,而作为一个能够独立运行的运算单元,使用它来做图像处理,将是非常适合的.为了挖掘机器的最大潜能,我没有采用比较常见的pyth ...

  8. 基于Python3.7和opencv的人脸识别(含数据收集,模型训练)

    前言 第一次写博客,有点紧张和兴奋.废话不多说,直接进入正题.如果你渴望使你的电脑能够进行人脸识别:如果你不想了解什么c++.底层算法:如果你也不想买什么树莓派,安装什么几个G的opencv:如果你和 ...

  9. [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 输出 ...

  10. [OpenCV实战]4 OpenCV中的颜色空间

    目录 1 不同的色彩空间 1.1RGB颜色空间 1.2 Lab色彩空间 1.3  YCrCb颜色空间 1.4 HSV颜色空间 2 如何使用这些颜色空间进行分割 2.1 获取特定颜色的颜色值 2.2 应 ...

随机推荐

  1. 流计算中kafka的OffsetReset策略

    朋友的公司做的是西南某边境省份网红新能源车的数据处理,由于新能源车的火爆,从年初从现在,数据量已经翻番.但与此同时,服务器却没有多少增加.无奈之下,只能暂时将kafka的数据存储时间由之前的1天改为6 ...

  2. 用Linux命令操作mysql数据库

    操作mysql数据库,相信大家最熟悉的应该是用navicat工具来新建数据库,建表,查询数据,查看表结构等. 但是如果数据库与本操作机器不在同一个局域网内,并且对方环境也不支持vpn的情况下,如何查询 ...

  3. BFF层聚合查询服务异步改造及治理实践 | 京东云技术团队

    首先感谢王晓老师的[接口优化的常见方案实战总结]一文总结,恰巧最近在对稳健理财BFF层聚合查询服务优化治理,针对文章内的串行改并行章节进行展开,分享下实践经验,主要涉及原同步改异步的过程.全异步化后衍 ...

  4. R画韦恩图之总结

    本文分享自微信公众号 - 生信科技爱好者(bioitee).如有侵权,请联系 support@oschina.cn 删除.本文参与"OSC源创计划",欢迎正在阅读的你也加入,一起分 ...

  5. 一定要看的前端codeReview规范指南

    一.前言 针对目录结构.CSS规范.JavaScript规范.Vue规范 可参照官方给出的 风格指南 这里主要总结业务开发中常遇到的代码问题和实践,帮助大家后续各自做好codeReview,一些你遇到 ...

  6. ImageIO的应用

    ImageIO的应用 一.关于IO流 在讲imageio之前,我们先来复习一下IO流的使用. 这里我建立一个Java类,用来实现读取文档中的内容,并且能够识别换行,话不多说,上代码: package ...

  7. 一次Mybaits查询的源码分析

    很好奇Mybaits是怎么将xml和mapper对应起来的,用一段比较简单的demo去debug追踪一下源码看看 先用xml配置的方式,看懂了再去看注解的方式是怎么实现的 获取Mapper Mybai ...

  8. Task Execution and Scheduling In SpringBoot

    开天辟地 Task Execution and Scheduling In the absence of an Executor bean in the context, Spring Boot au ...

  9. AntdPro中formItemProps和fieldProps的区别

    最近在工作中接触到了 antd 和 antd pro,作为一个 react 和 antd 新人,在学习和使用中遇到了不少的问题,下边就常见的一个问题来进行记录,后续还会记录更多的问题以及心得 Form ...

  10. Windows系统使用Nginx部署Vue

    Nginx是什么? Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器 ,同时也提供了IMAP/POP3/SMTP服务.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的R ...