Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >flea-db使用之JPA封装介绍

flea-db使用之JPA封装介绍

原创
作者头像
huazie
发布于 2024-08-05 02:08:27
发布于 2024-08-05 02:08:27
2510
举报
文章被收录于专栏:开发框架-Flea开发框架-Flea

引言

JPA(Java Persistence API,即 Java 持久层 API,它是 Java 平台上用于实现对象关系映射 (Object-Relational Mapping,简称ORM 的规范。它定义了 Java 对象如何映射到关系型数据库中的表,并提供了一套标准的 API 来管理这些映射关系以及数据库中的持久化对象。

为了方便开发人员后续快速接入 和 使用 JPA 操作数据库,本篇 Huazie 将向大家介绍笔者 Flea 框架下的 flea-db 模块封装JPA操作数据库的内容。

1. 参考

flea-db使用之封装JPA操作数据库 源代码

2. 依赖

MySQLJDBC 驱动 mysql-connector-java-5.1.25.jar

代码语言:xml
AI代码解释
复制
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.25</version>
</dependency>

JPA 实现 EclipseLink eclipselink-2.5.0.jar

代码语言:xml
AI代码解释
复制
<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>eclipselink</artifactId>
    <version>2.5.0</version>
</dependency>

3. 内容讲解

目前示例用的是 JPA + MySQL 模式,需要各位本地自行装下 MySQL 数据库

3.1 Flea JPA查询对象

FleaJPAQuery 用于实现 JPA 标准化方式的数据库查询操作,可以自行组装查询条件。下面对一些关键点进行讲解,且听我细细道来 (这一版并发环境下 可能存在问题,后面我会专门写一篇博文讲解 Flea JPA查询对象的问题,其中引入了对象池的概念 )。

  • 获取FleaJPAQuery实例,并初始化内部成员变量
    • EntityManager entityManagerJPA 中用于增删改查的持久化接口
    • Class sourceClazz : 实体类类对象
    • Class resultClazz : 操作结果类类对象
    • Root root : 根SQL表达式对象
    • CriteriaBuilder criteriaBuilder : 标准化生成器
    • CriteriaQuery criteriaQuery : 标准化查询对象
    • List<Predicate> predicates : Where条件集合
    • List<Order> orders : 排序集合
    • List<Expression> groups : 分组集合
    • getQuery() : 获取Flea JPA查询对象。新版本已废弃(单例模式,本身没有问题,但是由于获取之后 Flea JPA 查询对象还要使用,这在有点并发的环境下就存在问题了;后面我会单独写一篇博文讲解基于对象池的多例模式,既保证并发下各个线程获取的 Flea JPA 查询对象之间互不影响,同时也能保证尽可能少的新建 Flea JPA 查询对象)
    • init(EntityManager entityManager, Class sourceClazz, Class resultClazz) :获取 FleaJPAQuery 实例之后,一定要调用该方法进行初始化
    • initQueryEntity(Object entity) :初始化查询实体,主要用来构建查询条件值,以及分库分表
  • 拼接查询条件,添加排序和分组
    • equal(String attrName, Object value) : 等于条件 (单个属性列)
    • equal(Map<String, Object> paramMap) : 等于条件 (多个属性列)
    • notEqual(String attrName, Object value) : 不等于条件 (单个属性列)
    • notEqual(Map<String, Object> paramMap) : 不等于条件 (多个属性列)
    • isNull(String attrName)is null 条件,某属性值为空
    • isNotNull(String attrName)is not null 条件,某属性值为非空
    • in(String attrName, Collection value)in 条件, attrName 属性的值在 value 集合中
    • notIn(String attrName, Collection value)not in 条件,attrName 属性的值不在 value 集合中
    • like(String attrName, String value)like 条件, 模糊匹配
    • le(String attrName, Number value) : 小于等于条件
    • lt(String attrName, Number value) : 小于条件
    • ge(String attrName, Number value) : 大于等于条件
    • gt(String attrName, Number value) : 大于条件
    • between(String attrName, Date startTime, Date endTime)between and 条件, 时间区间查询
    • greaterThan(String attrName, Date value) : 大于某个日期值条件
    • greaterThanOrEqualTo(String attrName, Date value) : 大于等于某个日期值条件
    • lessThan(String attrName, Date value) : 小于某个日期值条件
    • lessThanOrEqualTo(String attrName, Date value) : 小于等于某个日期值条件
    • count() : 统计数目,在 getSingleResult 调用之前使用
    • countDistinct() : 统计数目(带 distinct 参数),在 getSingleResult 调用之前使用
    • max(String attrName) : 设置查询某属性的最大值,在 getSingleResult 调用之前使用
    • min(String attrName) : 设置查询某属性的最小值,在 getSingleResult 调用之前使用
    • avg(String attrName) : 设置查询某属性的平均值,在 getSingleResult 调用之前使用
    • sum(String attrName) : 设置查询某属性的值的总和,在 getSingleResult 调用之前使用
    • sumAsLong(String attrName) : 设置查询某属性的值的总和(Long),在 getSingleResult 调用之前使用
    • sumAsDouble(String attrName) : 设置查询某属性的值的总和(Double),在 getSingleResult 调用之前使用
    • distinct(String attrName) : 去重某一列
    • addOrderby(String attrName, String orderBy) : 添加 order by 子句
    • addGroupBy(String attrName) : 添加 group by 子句
  • 获取查询结果(记录行 或 单个结果)
    • getResultList() : 获取查询的记录行结果集合
    • getResultList(int start, int max) : 获取查询的记录行结果集合(设置查询范围)
    • getSingleResultList() : 获取查询的单个属性列结果集合。需要先调用 distinct,否则默认返回行记录结果集合
    • getSingleResultList(int start, int max) : 获取查询的单个属性列结果集合(设置查询范围,可用于分页)。需要先调用 distinct,否则默认返回行记录结果集合。
    • getSingleResult() : 获取查询的单个结果。需要提前调用 (count, countDistinct, max, min, avg, sum, sumAsLong, sumAsDouble)

3.2 数据处理的基本接口

IFleaJPABaseDataHandler 为基本的数据操作接口,其中包含了查询,(批量)添加,(批量)更新,删除等操作。

3.3 抽象Flea JPA DAO层接口

IAbstractFleaJPADAO 实现了基本的查询、(批量)添加、(批量)更新、删除接口

代码语言:java
AI代码解释
复制
public interface IAbstractFleaJPADAO<T> extends IFleaJPABaseDataHandler<T> {

}

3.4 抽象Flea JPA DAO层实现

AbstractFleaJPADAOImpl 中实现上述3中查询、(批量)添加、(批量)更新、删除的接口的具体逻辑。

  • 该类实现上述抽象 Flea JPA DAO 层接口,同样有类型T,由子类指定其操作的实体类。
代码语言:java
AI代码解释
复制
public abstract class AbstractFleaJPADAOImpl<T> implements IAbstractFleaJPADAO<T> 
  • 无参构造方法,用于获取子类指定的实体类类对象。
代码语言:java
AI代码解释
复制
/**
    * <p> 获取T类型的Class对象 </p>
    *
    * @since 1.0.0
    */
public AbstractFleaJPADAOImpl() {
    // 获取泛型类的子类对象的Class对象
    Class<?> clz = getClass();
    // 获取子类对象的泛型父类类型(也就是AbstractDaoImpl<T>)
    ParameterizedType type = (ParameterizedType) clz.getGenericSuperclass();
    if (LOGGER.isDebugEnabled()) {
        LOGGER.debug("Type={}", type);
    }
    Type[] types = type.getActualTypeArguments();
    clazz = (Class<T>) types[0];
    if (LOGGER.isDebugEnabled()) {
        LOGGER.debug("ClassName={}", clazz.getName());
    }
}
  • 实现接口方法,可参见上述类源码
  • 持久化接口获取,由子类实现(可参考下面的持久化单元 DAO 层实现)
    • getEntityManager() :获取实体管理器
    • getEntityManager(T entity) :获取实体管理器【entity 实体类对象实例】
    • getEntityManager(T entity, boolean flag) :获取实体管理器【entity 实体类对象实例,flag 获取实体管理器标识【truegetFleaNextValue 获取实体管理器, false: 其他场景获取实体管理器】】
代码语言:java
AI代码解释
复制
protected abstract EntityManager getEntityManager();

public EntityManager getEntityManager(T entity) throws CommonException {
    return getEntityManager(entity, false);
}

private EntityManager getEntityManager(T entity, boolean flag) throws CommonException {
    EntityManager entityManager = getEntityManager();

    // 实体类设置默认库名
    setDefaultLibName(entity);

    // 处理并添加分表信息,如果不存在分表则不处理
    entityManager = LibTableSplitHelper.findTableSplitHandle().handle(entityManager, entity, flag);
    return entityManager;
}
  • Flea JPA 查询对象获取【这里已经是使用 Flea JPA 查询对象池来获取 FleaJPAQuery
代码语言:java
AI代码解释
复制
protected FleaJPAQuery getQuery(Class result) {
    // 获取当前的持久化单元名
    String unitName = FleaEntityManager.getPersistenceUnitName(this.getClass().getSuperclass());
    FleaJPAQueryPool pool;
    if (StringUtils.isBlank(unitName)) {
        // 获取Flea JPA查询对象池 (使用默认对象池名"default"即可)
        pool = FleaObjectPoolFactory.getFleaObjectPool(FleaJPAQuery.class, FleaJPAQueryPool.class);
    } else {
        // 获取Flea JPA查询对象池 (使用持久化单元名unitName作为对象池名)
        pool = FleaObjectPoolFactory.getFleaObjectPool(unitName, FleaJPAQuery.class, FleaJPAQueryPool.class);
    }

    if (ObjectUtils.isEmpty(pool)) {
        throw new RuntimeException("Can not get a object pool instance");
    }

    // 获取Flea JPA查询对象实例
    FleaJPAQuery query = pool.getFleaObject();
    if (LOGGER.isDebugEnabled()) {
        Object obj = new Object() {};
        LOGGER.debug1(obj, "FleaJPAQueryPool = {}", pool);
        LOGGER.debug1(obj, "FleaJPAQuery = {}", query);
    }
    // 获取实例后必须调用该方法,对Flea JPA查询对象进行初始化
    query.init(getEntityManager(), entityClass, result);
    return query;
}

3.5 定义抽象Flea JPA SV层接口

IAbstractFleaJPASV 抽象 Flea JPA SV 层接口,继承 IFleaJPABaseDataHandler 接口,包含了通用的增删改查接口。

代码语言:java
AI代码解释
复制
public interface IAbstractFleaJPASV<T> extends IFleaJPABaseDataHandler<T> {
}

3.6 抽象Flea JPA SV层实现

AbstractFleaJPASVImpl 实现上述抽象 Flea JPA SV 层接口,相关代码也比较简单,具体接口实现内部调用抽象 Flea JPA DAO 层实现。

代码语言:java
AI代码解释
复制
    @Override
    public T query(long entityId) throws Exception {
        return getDAO().query(entityId);
    }

    // ... 其他接口实现已省略

    protected abstract IAbstractFleaJPADAO<T> getDAO();

3.7 持久化单元DAO层实现

FleaAuthDAOImpl 与持久化单元一一对应,如果新增一个持久化配置,即需要新增一个持久化单元 DAO 层实现,同时 Spring 配置中,需要加入对应的持久化单元事务管理者配置。

  • 持久化单元名 ----- fleaauth
  • 持久化事务管理者 ----- fleaauthTransactionManager
  • 持久化接口对象 ----- entityManager (该类由注解定义,由 Spring 配置中的 持久化接口工厂 fleaAuthEntityManagerFactory 初始化,详细可见下面持久化单元相关配置)

FleaAuth数据源DAO层父类

代码语言:java
AI代码解释
复制
public class FleaAuthDAOImpl<T> extends AbstractFleaJPADAOImpl<T> {

    @PersistenceContext(unitName="fleaauth")
    protected EntityManager entityManager;

    @Override
    @Transactional("fleaAuthTransactionManager")
    public boolean remove(long entityId) throws Exception {
        return super.remove(entityId);
    }
    
    // 其余代码省略。。。

    @Override
    protected EntityManager getEntityManager() {
        return entityManager;
    }

}

3.8 配置介绍

3.8.1 持久化单元配置

fleaauth-persistence.xml

代码语言:xml
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name="fleaauth" transaction-type="RESOURCE_LOCAL">
        <!-- provider -->
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <!-- Connection JDBC -->
        <class>具体实体类全名</class>
        <exclude-unlisted-classes>true</exclude-unlisted-classes>

        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/fleaauth?useUnicode=true&amp;characterEncoding=UTF-8" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="root" />
        </properties>
    </persistence-unit>
</persistence>

3.8.2 Spring配置

  • defaultPersistenceManager :持久化单元管理器
  • defaultPersistenceProvider :持久化提供者
  • defaultLoadTimeWeaver :加载时织入器
  • defaultVendorAdapterJPA 厂商适配器,对外公开 EclipseLink 的持久性提供程序和EntityManager扩展接口
  • defaultJpaDialectJpaDialect EclipseLink 持久化服务的实现
  • fleaAuthEntityManagerFactoryJPA 实体管理器工厂类
  • fleaAuthTransactionManagerJPA 事务管理器
代码语言:xml
AI代码解释
复制
<bean id="defaultPersistenceManager" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
	<property name="persistenceXmlLocations">
		<!-- 可以配置多个持久单元 -->
		<list>
			<value>classpath:META-INF/fleaauth-persistence.xml</value>
		</list>
	</property>
</bean>
<bean id="defaultPersistenceProvider" class="org.eclipse.persistence.jpa.PersistenceProvider"/>
<bean id="defaultLoadTimeWeaver" class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
<bean id="defaultVendorAdapter" class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
	<!-- 是否在控制台显示sql -->
	<property name="showSql" value="true"/>
</bean>
<bean id="defaultJpaDialect" class="org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect"/>

<!-- 以下部分 与指定持久化单元一一对应 -->
<!-- ################# -->
<!-- FleaAuth TransAction Manager JPA -->
<!-- ################# -->
<bean id="fleaAuthEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
	<property name="persistenceUnitManager" ref="defaultPersistenceManager"/>
	<property name="persistenceUnitName" value="fleaauth"/>
	<property name="persistenceProvider" ref="defaultPersistenceProvider"/>
	<property name="jpaVendorAdapter" ref="defaultVendorAdapter"/>
	<property name="jpaDialect" ref="defaultJpaDialect"/>
	<property name="jpaPropertyMap">
		<map>
			<entry key="eclipselink.weaving" value="false"/>
		</map>
	</property>
</bean>

<bean id="fleaAuthTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
	<property name="entityManagerFactory" ref="fleaAuthEntityManagerFactory"/>
</bean>

<tx:annotation-driven transaction-manager="fleaAuthTransactionManager"/>

总结

至此,相关 JPA 使用已封装完毕,欢迎大家评论区讨论。下一篇博文将介绍 《JPA接入》 ,向大家演示使用 JPA 封装代码来操作数据库,敬请期待!!!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
OpenCV图像处理10-图像模糊(二)
10-图像模糊(二) 中值滤波和双边滤波 中值滤波 统计排序滤波器 中值滤波对于椒盐噪声有很好的抑制作用 原理是:将Size(xradius,yradius)窗口中的像素值排序,取中值赋给窗口中心点 双边滤波 均值滤波无法客服边缘像素信息丢失的缺陷,原因是均值滤波基于平均权重 高斯滤波部分克服了该缺陷,但仍无法完全避免,因为没有考虑到像素值的不同 高斯双边模糊是保留边缘的滤波方法,避免了边缘信息的丢失,能够保证图像轮廓不变 相关API 代码演示 #include<opencv2/o
yangjiao
2021/03/04
5370
【OpenCV入门之十六】多种方式模糊图像
其中:f()表示一副图像,i、j表示图像的行和列,h(k,l)表示卷积算子(和)(也可以叫掩膜),k l又可以叫窗口大小(掩膜的大小,比如3*3),g()表示输出的像素值;
小白学视觉
2019/06/02
5870
OpenCV图像处理笔记(二):图片操作进阶
一、图像模糊 1、模糊原理 Smooth/Blur 是图像处理中最简单和常用的操作之一 使用该操作的原因之一就为了给图像预处理时候减低噪声 使用Smooth/Blur操作其背后是数学的卷积计算 通常这
MiChong
2020/09/24
1.2K0
OpenCV图像处理笔记(二):图片操作进阶
OpenCV图像处理05-图像操作
05-图像操作 #include<opencv2/opencv.hpp> #include<iostream> using namespace std; using namespace cv; int main() { Mat src,gray_src; src = imread("D:\\heroRcData\\opencvProject\\arrowImg\\02\\01.jpg"); if (!src.data) { cout << "could not load image..." <<
yangjiao
2021/03/04
3840
Ubuntu Opencv 图像平滑处理
平滑 也称 模糊, 是一项简单且使用频率很高的图像处理方法。平滑处理时需要用到一个 滤波器 。 最常用的滤波器是 线性 滤波器,线性滤波处理的输出像素值 ( g(i,j)) 是输入像素值 (f(i+k,j+l))的加权和 :
FPGA开源工作室
2019/10/29
5710
Ubuntu Opencv 图像平滑处理
OpenCV图像处理03-矩阵的掩膜操作
03-矩阵的掩膜操作 #include<opencv2/opencv.hpp> #include<iostream> #include<math.h> using namespace std; using namespace cv; int main() { Mat src, dst; src = imread("D:\\heroRcData\\opencvProject\\arrowImg\\01\\01.jpg"); if (!src.data) { cout << "could not lo
yangjiao
2021/03/04
3350
OpenCV之中值模糊
中值滤波本质上是统计排序滤波器的一种,中值滤波对图像特定噪声类型(椒盐噪声)会取得比较好的去噪效果,也是常
MachineLP
2021/07/20
2630
OpenCV之中值模糊
OpenCV 边缘检测
Canny 边缘检测算子,其算法步骤大体如下: 1) 用高斯滤波器对输入图像做平滑处理 (大小为 5x5 的高斯核)
AI异构
2020/07/29
9860
OpenCV 边缘检测
OpenCV图像处理笔记(三):霍夫变换、直方图、轮廓等综合应用
一、霍夫直线变换 1、霍夫直线变换 Hough Line Transform用来做直线检测 前提条件 – 边缘检测已经完成 平面空间到极坐标空间转换 2、霍夫直线变换介绍 对于任意一条直线上的所有点来说 变换到极坐标中,从[0~360]空间,可以得到r的大小 属于同一条直线上点在极坐标空(r, theta)必然在一个点上有最强的信号出现,根据此反算到平面坐标中就可以得到直线上各点的像素坐标。从而得到直线 3、相关API 标准的霍夫变换 cv::HoughLines从平面坐标转换到霍夫空间,最终输出是
MiChong
2020/09/24
3K0
OpenCV图像处理笔记(三):霍夫变换、直方图、轮廓等综合应用
图像处理算法 之 滤波 模糊(基于OpenCV)
高斯噪声是指幅值的概率密度函数服从高斯分布的噪声,如果其功率谱密度服从均匀分布,则为高斯白噪声。
233333
2020/11/11
9350
图像处理算法 之 滤波 模糊(基于OpenCV)
OpenCV 图片缩放
对图像进行缩放的最简单方法就是调用OpenCV中resize函数。resize函数可以将源图像精确地转化为指定尺寸的目标图像。要缩小图像,一般推荐使用CV_INETR_AREA来插值;若要放大图像,推荐使用CV_INTER_LINEAR。
AI异构
2020/07/29
3.5K0
OpenCV 图片缩放
OpenCV图像处理笔记(一):图片基本操作
==如果有报无法找到opencv_world343.dll的Error,请把C:\opencv\build\x64\vc14\bin下的opencv_world343.dll文件复制到C:\Windows 目录下即可==
MiChong
2020/09/24
1.4K0
OpenCV图像处理笔记(一):图片基本操作
OpenCV中积分图介绍与应用
OpenCV中积分图函数与应用 一:图像积分图概念 积分图像是Crow在1984年首次提出,是为了在多尺度透视投影中提高渲染速度。随后这种技术被应用到基于NCC的快速匹配、对象检测和SURF变换中、基于统计学的快速滤波器等方面。积分图像是一种在图像中快速计算矩形区域和的方法,这种算法主要优点是一旦积分图像首先被计算出来我们可以计算图像中任意大小矩形区域的和而且是在常量时间内。这样在图像模糊、边缘提取、对象检测的时候极大降低计算量、提高计算速度。第一个应用积分图像技术的应用是在Viola-Jones的对象检
OpenCV学堂
2018/04/04
2.9K0
OpenCV中积分图介绍与应用
OpenCV中导向滤波介绍与应用
OpenCV中导向滤波介绍与应用 导向滤波介绍 导向滤波是使用导向图像作为滤波内容图像,在导向图像上实现局部线性函数表达,实现各种不同的线性变换,输出变形之后的导向滤波图像。根据需要,导向图像可以跟输
OpenCV学堂
2018/04/04
2.4K0
OpenCV中导向滤波介绍与应用
OpenCV之图像均值与高斯模糊
python代码: import cv2 as cv import numpy as np src = cv.imread("./test.png") cv.namedWindow("input", cv.WINDOW_AUTOSIZE) cv.imshow("input", src) dst1 = cv.blur(src, (5, 5)) dst2 = cv.GaussianBlur(src, (5, 5), sigmaX=15) dst3 = cv.GaussianBlur(src, (0, 0)
MachineLP
2021/07/20
5810
OpenCV之图像均值与高斯模糊
OpenCV中图像修复技术介绍与演示
现实中图像经常出现划伤或者被噪声腐蚀或者有污渍点,对于这类图像可以通过修复(inpainting)相关的算法来说恢复损害的图像。一般情况下这些算法都是基于污染区域的周围已知的颜色和结构,通过繁殖和混合重新生成填充污染区域。OpenCV中实现的图像修复算法有两种。 基于Navier-Stokes的修复方法 基于图像梯度的快速匹配方法又称(Telea法) 对应的两个枚举类型分别如下: CV_INPAINT_NS CV_INPAINT_TELEA 在OpenCV3.1.0中对应的API方法为inpaint sr
OpenCV学堂
2018/04/04
1.5K0
OpenCV中图像修复技术介绍与演示
图像各向异性滤波
各向异性概念 各向异性(英文名称:anisotropy)是指材料在各方向的力学和物理性能呈现差异的特性。晶体的各向异性即沿晶格的不同方向,原子排列的周期性和疏密程度不尽相同,由此导致晶体在不同方向的物理化学特性也不同,这就是晶体的各向异性。亦称“非均质性”。物体的全部或部分物理、化学等性质随方向的不同而各自表现出一定的差异的特性。即在不同的方向所测得的性能数值不同。对图像来说各向异性就是在每个像素点周围四个方向上梯度变化都不一样,滤波的时候我们要考虑图像的各向异性对图像的影响,而各向同性显然是说各个方向的
OpenCV学堂
2018/04/04
2.4K0
图像各向异性滤波
OpenCV 图像处理学习手册:1~5
本章旨在与 OpenCV,其安装和第一个基本程序进行首次接触。 我们将涵盖以下主题:
ApacheCN_飞龙
2023/04/27
2.9K0
OpenCV 图像处理学习手册:1~5
OpenCV之边缘保留滤波算法 – 高斯双边模糊
python代码: import cv2 as cv import numpy as np src = cv.imread("./test.png") cv.namedWindow("input", cv.WINDOW_AUTOSIZE) cv.imshow("input", src) h, w = src.shape[:2] dst = cv.bilateralFilter(src, 0, 100, 10) result = np.zeros([h, w*2, 3], dtype=src.dtype)
MachineLP
2021/07/20
4920
OpenCV之边缘保留滤波算法 – 高斯双边模糊
基于OpenCV的图像分割处理!
图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单、计算量小、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术。它特别适用于目标和背景占据不同灰度级范围的图像。它不仅可以极大的压缩数据量,而且也大大简化了分析和处理步骤,因此在很多情况下,是进行图像分析、特征提取与模式识别之前的必要的图像预处理过程。
Datawhale
2020/07/09
3.6K0
基于OpenCV的图像分割处理!
相关推荐
OpenCV图像处理10-图像模糊(二)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档