OpenCV开发笔记(七十八):在ubuntu上搭建opencv+python开发环境以及匹配识别Demo

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/140435870

长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…

OpenCV开发专栏(点击传送门)

上一篇:《OpenCV开发笔记(七十七):相机标定(二):通过棋盘标定计算相机内参矩阵矫正畸变摄像头图像》
下一篇:持续补充中…


前言

  Python上的OpenCv开发,在linux上的基本环境搭建流程。


安装python

  以python2.7为开发版本。

sudo apt-get install python2.7
sudo apt-get install python2.7-dev

安装OpenCV

  多种方式,先选择最简单的方式。

sudo apt-get install python-opencv	

打开摄像头

测试Demo

import cv2
import numpy
cap = cv2.VideoCapture(0)
while 1:
  ret, frame = cap.read()
  cv2.imshow("capture", frame)
  if cv2.waitKey(100) & 0xff == ord('q'):
    break
cap.release()
cv2.destroyAllWindows()

  在这里插入图片描述

  在这里插入图片描述

测试结果

  在这里插入图片描述


模板匹配

测试Demo

import cv2
import numpy

# read template image
template = cv2.imread("src.png")
#cv2.imshow("template", template);

# read target image
target = cv2.imread("dst.png")
#cv2.imshow("target", target)

# get tempalte's width and height
tHeight, tWidth = template.shape[:2]
print tHeight, tWidth

# matches
result = cv2.matchTemplate(target, template, cv2.TM_SQDIFF_NORMED)

# normalize
cv2.normalize(result, result, 0, 1, cv2.NORM_MINMAX, -1)

minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(result)

strminVal = str(minVal)
print strminVal

cv2.rectangle(target, minLoc, (minLoc[0] + tWidth, minLoc[1] + tHeight), (0,0,255), 2)

cv2.imshow("result", target)

cv2.waitKey()

cv2.destroyAllWindows()

测试结果

  在这里插入图片描述


Flann特征点匹配

版本回退

  在opencv3.4.x大版本后,4.x系列的sift被申请了专利,无法使用了,flann需要使用到

sift = cv2.xfeatures2d.SIFT_create()

  所以需要回退版本。

sudo apt-get remove python-opencv
sudo pip install opencv-python==3.4.2.16

  安装模块库matplotlib

python -m pip install matplotlib
sudo apt-get install python-tk
pip install opencv-contrib-python==3.4.2.16

测试Demo

# FLANN based Matcher
import numpy as np
import cv2
from matplotlib import pyplot as plt
 
#min match count is 10
MIN_MATCH_COUNT = 10 
# queryImage
template = cv2.imread('src.png',0) 
# trainImage
target = cv2.imread('dst.png',0) 
# initiate SIFT detector
sift = cv2.xfeatures2d.SIFT_create()
# find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(template,None)
kp2, des2 = sift.detectAndCompute(target,None)
# create FLANN match
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks = 50)
flann = cv2.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(des1,des2,k=2)
# store all the good matches as per Lowe's ratio test.
good = []
# lose < 0.7
for m,n in matches:
    if m.distance < 0.7*n.distance:
        good.append(m)
if len(good)>MIN_MATCH_COUNT:
    # get key
    src_pts = np.float32([ kp1[m.queryIdx].pt for m in good ]).reshape(-1,1,2)
    dst_pts = np.float32([ kp2[m.trainIdx].pt for m in good ]).reshape(-1,1,2)
    # cal mat and mask
    M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
    matchesMask = mask.ravel().tolist()
    h,w = template.shape
    # convert 4 corner
    pts = np.float32([ [0,0],[0,h-1],[w-1,h-1],[w-1,0] ]).reshape(-1,1,2)
    dst = cv2.perspectiveTransform(pts,M)
    cv2.polylines(target,[np.int32(dst)],True,0,2, cv2.LINE_AA)
else:
    print( "Not enough matches are found - %d/%d" % (len(good),MIN_MATCH_COUNT))
    matchesMask = None
draw_params = dict(matchColor=(0,255,0), 
                   singlePointColor=None,
                   matchesMask=matchesMask, 
                   flags=2)

result = cv2.drawMatches(template, kp1, target, kp2, good, None, **draw_params)
cv2.imshow("dst", result)
cv2.imshow("dst2", target)
cv2.waitKey()

测试结果

  在这里插入图片描述


上一篇:《OpenCV开发笔记(七十七):相机标定(二):通过棋盘标定计算相机内参矩阵矫正畸变摄像头图像》
下一篇:持续补充中…


本文章博客地址:https://hpzwl.blog.csdn.net/article/details/140435870

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/800243.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PHP恋爱话术微信小程序系统源码

&#x1f496;恋爱高手的秘密武器&#xff01;恋爱话术微信小程序&#xff0c;让情话信手拈来✨ &#x1f4ad;【开场白&#xff1a;恋爱路上的甜蜜助手】&#x1f4ad; 还在为跟心仪的TA聊天时找不到话题而尴尬&#xff1f;或是担心自己说的每句话都显得那么“直男/女”&…

Python和C++行人轨迹预推算和空间机器人多传感融合双图算法模型

&#x1f3af;要点 &#x1f3af;双图神经网络模型&#xff1a;最大后验推理和线性纠错码解码器 | &#x1f3af;重复结构和过约束问题超图推理模型 | &#x1f3af;无向图模型变量概率计算、和积消息传播图结构计算、隐马尔可夫模型图结构计算、矩阵图结构计算、图结构学习 |…

mysql group_concat()函数、行转列函数

文章目录 一、group_concat函数1.1、语法1.2、示例1.2.1、查询所有姓名&#xff0c;并显示在一行1.2.2、单列合并&#xff0c;指定冒号分隔符1.2.3、单列合并&#xff0c;去重1.2.4、多列拼接合并1.2.5、多列拼接合并&#xff0c;列和列之间指定分隔符 在mysql的关联查询或子查…

安卓学习中遇到的问题【bug】

安卓学习中遇到的问题 1Gradle下载慢怎么办&#xff1f; Gradle下载慢怎么办&#xff1f; distributionUrlhttps://mirrors.cloud.tencent.com/gradle/gradle-7.5-bin.zip 2 Could not resolve all files for configuration ‘:classpath‘. &#xff1e; Could not resolv…

聊聊常见的分布式ID解决方案

highlight: xcode theme: vuepress 为什么要使用分布式ID&#xff1f; 随着 Web 开发技术的不断发展&#xff0c;单体的系统逐步走向分布式系统。在分布式系统中&#xff0c;使用分布式 ID(Distributed IDs)主要是为了在没有单点故障的情况下生成唯一标识符。这些唯一标识符在很…

Python 读取esxi上所有主机的设备信息

&#xff08;主要是为了统计所有虚拟机的设备名称和所属主机&#xff09; 代码&#xff1a; from pyVim import connect from pyVmomi import vim import ssldef get_vm_devices(vm):devices []try:if vm.config is not None and hasattr(vm.config, hardware) and hasattr(v…

AI安全系列——[第五空间 2022]AI(持续更新)

最近很长时间没有更新&#xff0c;其实一直在学习AI安全&#xff0c;我原以为学完深度学习之后再学AI安全会更加简单些&#xff0c;但是事实证明理论转实践还是挺困难的&#xff0c;但是请你一定要坚持下去&#xff0c;因为“不是所有的坚持都有结果&#xff0c;但总有一些坚持…

Mac电脑清理软件有哪些 MacBooster和CleanMyMac哪个好用 苹果电脑清理垃圾软件推荐 cleanmymac和柠檬清理

对于苹果电脑用户来说&#xff0c;‌选择合适的清理软件可以帮助优化电脑性能&#xff0c;‌释放存储空间&#xff0c;‌并确保系统安全。一款好用的苹果电脑清理软件&#xff0c;能让Mac系统保持良好的运行状态&#xff0c;避免系统和应用程序卡顿的产生。有关Mac电脑清理软件…

CSS-1_0 CSS和文档流

文章目录 CSS和文档流如何证明这个流的存在呢&#xff1f;流和display番外&#xff1a;inline-block 碎碎念 CSS和文档流 首先什么叫流呢&#xff1f; 通常来说&#xff0c;我们最终看到的网页是HTML文档中定义的各个元素挨个输出的结果&#xff0c;这种一个接一个输出的方式…

14_Shell重定向输入输出

14_Shell重定向输入输出 输出重定向&#xff1a;一般情况&#xff0c;输出是在终端直接显示&#xff0c;改变输出位置&#xff0c;改变到文件中&#xff0c;这就是输出重定向 输入重定向&#xff1a;一般情况&#xff0c;输入是读取用户终端输入&#xff0c;改变输入位置&#…

Java二十三种设计模式-建造者模式(4/23)

建造者模式&#xff1a;构建复杂对象的专家 引言 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;用于创建一个复杂的对象&#xff0c;同时允许用户只通过指定复杂对象的类型和内容就能构建它们&#xff0c;它将对象的构建和表示分离&am…

Spring Boot 集成 RabbitMQ

依赖与配置 在 pom.xml 中引入 RabbitMQ 相关依赖 <!-- AMQP 依赖, RabbitMq --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId><version>3.2.7</version> &…

详解注意力机制上篇【RNN,Seq2Seq(Encoder-Decoder,编码器-解码器)等基础知识】

NLP-大语言模型学习系列目录 一、注意力机制基础——RNN,Seq2Seq等基础知识 二、注意力机制【Self-Attention,自注意力模型】 &#x1f525; 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;理解和生成自然语言的能力对于构建智能系统至关重要。从文本分类、机器翻…

昇思25天学习打卡营第22天|基于MindSpore的红酒分类实验

基于MindSpore的红酒分类实验 K近邻算法实现红酒聚类 1、实验目的 了解KNN的基本概念&#xff1b;了解如何使用MindSpore进行KNN实验。 2、K近邻算法原理介绍 K近邻算法&#xff08;K-Nearest-Neighbor, KNN&#xff09;是一种用于分类和回归的非参数统计方法&#xff0c;…

WSL-Ubuntu20.04环境使用YOLOv8 TensorRT推理加速

在阅读本章内容之前&#xff0c;需要把部署环境以及训练环境都安装好。 1.TensorRTX下载 这里使用Wang-xinyu大佬维护的TensorRTX库来对YOLOv8进行推理加速的演示&#xff0c;顺便也验证一下前面环境配置的成果。 github地址&#xff1a;GitHub - wang-xinyu/tensorrtx&#x…

SourceTree rebase(变基)的使用

参考资料 【Sourcetree】コミットを一つにまとめる【Sourcetree】リベースする 目录 前提0.1 merge与rebase0.2 merge合并分支0.3 rebase合并分支0.4 &#x1f4a5;超级注意事项&#x1f4a5; 一. 代码已提交&#xff0c;未推送&#xff0c;交互式变基1.1 通过SourceTree操作1…

Richtek立锜科技可用于智能门铃的电源管理解决方案

新型的智能门铃不仅能满足呼叫、提醒的需要&#xff0c;还能在线监控、远程操作、闯入通知、记录过程&#xff0c;系统构成相对复杂&#xff0c;与传统门铃相比有了很大的改变。 从电源管理的角度来观察&#xff0c;满足这样需求的系统构成也相对复杂&#xff1a; 处于外置状态…

ElementUIV12相关使用方法

今日内容 零、 复习昨日 零、 复习昨日 一、Element UI Element&#xff0c;一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库 官网&#xff1a; https://element.eleme.cn/#/zh-CN Element Plus,基于 Vue 3&#xff0c;面向设计师和开发者的组件库 官网: htt…

多样化数据可视化方法的全面示例:基于Python的多样化数据可视化

文章目录 前言代码效果展示 前言 本文演示了使用Python进行温度数据的多样化可视化方法。通过导入、处理和分析气象数据&#xff0c;我们生成了多种图表&#xff0c;包括直方图、核密度估计图、箱型图、小提琴图、条形图、山脊图、经验累积分布函数图和折线图。这些图表帮助我…

从产品手册用户心理学分析到程序可用性与易用性的重要区别

注&#xff1a;机翻&#xff0c;未校对。 Designing for People Who Have Better Things To Do With Their Lives 为那些生活中有更重要事情要做的人设计 When you design user interfaces, it’s a good idea to keep two principles in mind: 在设计用户界面时&#xff0c;…