首页 文章 精选 留言 我的

精选列表

搜索[opencv],共654篇文章
优秀的个人博客,低调大师

(GO_GTD_3)基于OpenCV和QT,建立Android图像处理程序

一、解决权限问题 图片采集了,处理了,如何保存?最直接的方法是使用imwrite,但是如果现在直接使用的话,比如会出现这样或那样的错误,因为我们现在是在android的环境下进行图像处理,所以必须要融入到Android的权限管理系统中去。 在新版本的QT中,这一步是这样做的:项目->详情 createtemp 然后就可以修改了 修改logo,添加权限 这个时候已经可以使用imwrite了,此外我添加了一些东西 //保存处理结果数据 void MainWindow :: on_btn_save_pressed () { if ( b_canSave ) { //获得当前时间 QDateTime current_date_time = QDateTime :: currentDateTime (); QString current_date = current_date_time . toString ( "yyyy_MM_dd" ); try { if ( isDirExist ( "/storage/emulated/0/GO_GTD" )) { cv :: imwrite ( "/storage/emulated/0/GO_GTD/" + current_date . toStdString ()+ ".jpg" ,matResult); ui -> lb_info -> setText (strFetchImage+ "result保存成功!" ); } else { ui -> lb_info -> setText ( "目录创建失败!" ); } } catch ( Exception e ) { ui -> lb_info -> setText (strFetchImage+ "保存失败,请查找原因!" ); } } else { ui -> lb_info -> setText ( "未处理图像无法保存,请先进行处理操作!" ); } } 其中有一个创建新文件夹的函数 /*判断文件夹是否存在,不存在则创建*/ bool isDirExist ( QString fullPath ) { QDir dir ( fullPath ); if ( dir . exists ()) { return true ; } else { bool ok = dir . mkpath ( fullPath ); //创建多级目录 return ok ; } } 二、使用过程中发现的突出问题 到目前为止,GO_GTD已经可以使用了,作为一个我自己研究和使用的工具,我确实是每天都在使用。到了这一步,主要是以下问题: 1、图像的采集,目前采用的是图片采集的方式,这个方式最大的问题就是不知道你采集的图片是否是可用的。下一步需要修改成类似二维码的采集模式,也就是视频直接处理的模式。这个首先从做特征点开始; 2、图像结果的存储使用,目前保存到文件夹中,那么如果想要使用,想要在app上面直接看到结果,还有很多qml方面需要研究的东西。 感谢阅读至此希望有所帮助! 来自为知笔记(Wiz) 目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com

优秀的个人博客,低调大师

树莓派opencv手势识别点亮led灯或响蜂鸣器 (附完整代码)

文章目录 前言 一、树莓派引脚介绍 1.1引脚设置 二、代码书写 2.1引入库 2.2示例代码点亮led 响蜂鸣器 三完整代码 图片 前言 材料:树莓派 摄像头 SG90舵机两个 PCA9685拓展板 led小灯 蜂鸣器模块 一、树莓派引脚介绍 树莓派引脚对照表 可以看到一共有三种定义方式 分别是Wiring Pi编码,BCM编码和BOARD物理引脚编码。 1.1引脚设置 在最开始终端输入 sudo raspi-config 进入设置 后找到 Interfacing Options 进入 找到 Remote GPIO 开启GPIO 二、代码书写 2.1引入库 在最开始导入库 import RPi.GPIO as GPIO #1导入引脚库 GPIO.setmode(GPIO.BOARD) # 2定义引脚方式 此处为BOARD编码 GPIO.setup(channel, GPIO.OUT) # 3建立通道 该函数需要两个参数 第一个为引脚编号 第二个为模式定义 #此处为输出 GPIO.output(7, True)#4 驱动通道 GPIO.cleanup()#5清除 释放资源 2.2示例代码点亮led 响蜂鸣器 #导入gpio模块 调用引脚 import RPi.GPIO as GPIO #初始化引脚模式为BOARD 屏蔽警告 GPIO.setmode(GPIO.BOARD) GPIO.setwarnings(False) #引脚定义 蜂鸣器接的35引脚 led接的37引脚 beep=35 led=37 GPIO.setup(beep,GPIO.OUT)#设置gpio模式为输出 GPIO.setup(led,GPIO.OUT) GPIO.output(led,GPIO.HIGH)#开灯 GPIO.output(led,GPIO.LOW)#关灯 GPIO.output(beep,GPIO.HIGH)#蜂鸣器响 GPIO.output(beep,GPIO.LOW)#蜂鸣器关 三完整代码 图片 #!/usr/bin/env python2 # -*- coding: utf-8 -*- """ * @par Copyright (C): 2010-2020, hunan CLB Tech * @file 50_Hand_gestures.py * @version V2.0 * @details * @par History @author: zhulin """ import cv2 import numpy as np import math import time import sys import Adafruit_PCA9685#导入PCA9685模块 #设置编码为utf-8 import importlib importlib.reload(sys) #sys.setdefaultencoding('utf8') #导入gpio模块 调用引脚 import RPi.GPIO as GPIO #初始化引脚模式为BOARD 屏蔽警告 GPIO.setmode(GPIO.BOARD) GPIO.setwarnings(False) #引脚定义 蜂鸣器接的35引脚 led接的37引脚 beep=35 led=37 GPIO.setup(beep,GPIO.OUT)#设置gpio模式为输出 GPIO.setup(led,GPIO.OUT) #初始化PCA9685和舵机 servo_pwm = Adafruit_PCA9685.PCA9685() # 实例话舵机云台 # 设置舵机初始值,可以根据自己的要求调试 servo_pwm.set_pwm_freq(60) # 设置频率为60HZ servo_pwm.set_pwm(5,0,325) # 底座舵机 servo_pwm.set_pwm(4,0,325) # 倾斜舵机 time.sleep(1) #初始化摄像头并设置阙值 cap = cv2.VideoCapture(0) cap.set(3,120) cap.set(4,160) while(1): try: #an error comes if it does not find anything in window as it cannot find contour of max area #therefore this try error statement ret, frame = cap.read() frame=cv2.flip(frame,1) kernel = np.ones((3,3),np.uint8) #define region of interest roi=frame[0:300, 0:300] cv2.rectangle(frame,(0,0),(300,300),(0,255,0),0) hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV) # define range of skin color in HSV lower_skin = np.array([0,20,70], dtype=np.uint8) upper_skin = np.array([20,255,255], dtype=np.uint8) #extract skin colur imagw mask = cv2.inRange(hsv, lower_skin, upper_skin) #extrapolate the hand to fill dark spots within mask = cv2.dilate(mask,kernel,iterations = 4) #blur the image mask = cv2.GaussianBlur(mask,(5,5),100) #find contours _,contours,hierarchy= cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) #find contour of max area(hand) cnt = max(contours, key = lambda x: cv2.contourArea(x)) #approx the contour a little epsilon = 0.0005*cv2.arcLength(cnt,True) approx= cv2.approxPolyDP(cnt,epsilon,True) #make convex hull around hand hull = cv2.convexHull(cnt) #define area of hull and area of hand areahull = cv2.contourArea(hull) areacnt = cv2.contourArea(cnt) #find the percentage of area not covered by hand in convex hull arearatio=((areahull-areacnt)/areacnt)*100 #find the defects in convex hull with respect to hand hull = cv2.convexHull(approx, returnPoints=False) defects = cv2.convexityDefects(approx, hull) # l = no. of defects l=0 #code for finding no. of defects due to fingers for i in range(defects.shape[0]): s,e,f,d = defects[i,0] start = tuple(approx[s][0]) end = tuple(approx[e][0]) far = tuple(approx[f][0]) pt= (100,180) # find length of all sides of triangle a = math.sqrt((end[0] - start[0])**2 + (end[1] - start[1])**2) b = math.sqrt((far[0] - start[0])**2 + (far[1] - start[1])**2) c = math.sqrt((end[0] - far[0])**2 + (end[1] - far[1])**2) s = (a+b+c)/2 ar = math.sqrt(s*(s-a)*(s-b)*(s-c)) #distance between point and convex hull d=(2*ar)/a # apply cosine rule here angle = math.acos((b**2 + c**2 - a**2)/(2*b*c)) * 57 # ignore angles > 90 and ignore points very close to convex hull(they generally come due to noise) if angle <= 90 and d>30: l += 1 cv2.circle(roi, far, 3, [255,0,0], -1) #draw lines around hand cv2.line(roi,start, end, [0,255,0], 2) l+=1 #print corresponding gestures which are in their ranges font = cv2.FONT_HERSHEY_SIMPLEX if l==1: if areacnt<2000: cv2.putText(frame,'Put hand in the box',(0,50), font, 2, (0,0,255), 3, cv2.LINE_AA) else: if arearatio<12: cv2.putText(frame,'0',(0,50), font, 2, (0,0,255), 3, cv2.LINE_AA) elif arearatio<17.5: cv2.putText(frame,'Best of luck',(0,50), font, 2, (0,0,255), 3, cv2.LINE_AA) else: cv2.putText(frame,'1',(0,50), font, 2, (0,0,255), 3, cv2.LINE_AA) GPIO.output(led,GPIO.HIGH)#开灯 elif l==2: cv2.putText(frame,'2',(0,50), font, 2, (0,0,255), 3, cv2.LINE_AA) GPIO.output(led,GPIO.LOW)#关灯 elif l==3: if arearatio<27: cv2.putText(frame,'3',(0,50), font, 2, (0,0,255), 3, cv2.LINE_AA) GPIO.output(beep,GPIO.HIGH)#蜂鸣器响 else: pass#屏蔽ok手势 #cv2.putText(frame,'ok',(0,50), font, 2, (0,0,255), 3, cv2.LINE_AA) elif l==4: cv2.putText(frame,'4',(0,50), font, 2, (0,0,255), 3, cv2.LINE_AA) GPIO.output(beep,GPIO.LOW)#蜂鸣器关 elif l==5: cv2.putText(frame,'5',(0,50), font, 2, (0,0,255), 3, cv2.LINE_AA) GPIO.output(led,GPIO.HIGH)#开灯 time.sleep(0.5) GPIO.output(beep,GPIO.HIGH)#蜂鸣器响 time.sleep(0.5) GPIO.output(beep,GPIO.LOW)#蜂鸣器关 time.sleep(0.5) GPIO.output(led,GPIO.LOW)#关灯 time.sleep(0.5) elif l==6: cv2.putText(frame,'reposition',(0,50), font, 2, (0,0,255), 3, cv2.LINE_AA) else : cv2.putText(frame,'reposition',(10,50), font, 2, (0,0,255), 3, cv2.LINE_AA) #show the windows cv2.imshow('mask',mask) cv2.imshow('frame',frame) except: pass k = cv2.waitKey(5) & 0xFF if k == 27: break cv2.destroyAllWindows() cap.release() 实现功能 : 识别手势1 伸一个指头 点亮LED 灯 识别手势2 伸两个指头 关闭LED 灯 识别手势3 伸三个指头 响蜂鸣器 识别手势4 伸四个指头 蜂鸣器关 识别手势5 伸5个指头 声光警报 成品展示:

优秀的个人博客,低调大师

目标检测必须要OpenCV?10行Python代码也能实现,亲测好用!

短短10行代码就可以实现目标检测?! 本文作者和他的团队构建了一个名为ImageAI 的Python库,集成了现今流行的深度学习框架和计算机视觉库。本文将手把手教你构建自己的第一个目标检测应用,而且文摘菌已经帮你踩过坑了,亲测有效! 无人超市、人脸识别、无人驾驶,众多的使用场景及案例,使得【目标检测】正成为计算机视觉最有前景的方向。 听起来似乎是个很难实现的技术,需要大量训练数据和算法才能完成。事实上,本文作者开发了一个基于Python的函数库,可以用十行代码高效实现目标检测。 还不熟悉的读者,我们先来看看,目标检测到底是什么,以及软件开发人员面临的挑战。 目标检测是借助于计算机和软件系统在图像/场景中,定位目标并识别出每个目标的类别的技术。目前已广泛用于人脸检测、车辆检测、行人计数、网络图像、安全系统和无人驾驶汽车等领域。随着计算机技术不

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册