基于树莓派车牌识别门禁系统

news/2024/9/16 18:34:20/

基于树莓派车牌识别门禁系统

  • 前言
    • 开发环境
    • 源码
    • 硬件
    • 效果演示
    • 后记

前言

毕业设计想做一个集大学所自学过的所有语言,再加上嵌入式的完整应用类型。但由于疫情的原因,没办法完整的展现。不过中间还是自己一系列将前端、后端、前后端交互、数据库以及Android控制都整了一遍,还是受益匪浅。在此将经验分享出来顺便自己也留恋一下,止增消遣。

开发环境

在最初,本来想直接在树莓派上跑车牌识别的Python源码,但由于树莓派用的是3B型号的,要跑这种深度学习框架的东西内存不太够,即使改了特征参数还是容易崩掉,最后实在没办法就采用PC做主控端、树莓派做采集端的方案来做。后面发现这样搞还容易加web端这些后续拓展,这也算是曲线救国哈哈

  1. 树莓派 :3B加系统2019-09-26-raspbian-buster.img;
  2. PC :Visual studio2019;
  3. 数据库: MySQL8.0版本;
  4. HTML :Adobe公司的DW;
  5. 前后端交互: Flask框架+ajax轮询;
  6. Android :Android studio;
  7. 车牌识别算法 :OpenCV-4.1.0+Python3.7,具体参考大佬博客车牌号识别 python + opencv;
  8. 深度学习训练样本 :Anaconda3-2019.10-Windows-x86_64+tensorflow,具体参考大佬博客TensorFlow车牌识别完整版(含车牌数据集)。

源码

链接:https://pan.baidu.com/s/11HsGVzaFizBd-yzvfqK9gw
提取码:zxuv
具体的源码请看百度网盘下载,也在csdn里扔了一份。这里贴上一部分主要程序,可单独运行。
PC识别主控端:
1.surface.py

# -*- coding: utf-8 -*-
import tkinter as tk
import urllib
from tkinter.filedialog import *
from tkinter import ttk
import predict
import cv2
from PIL import Image, ImageTk
import threading
import time
import numpy as np
import urllib.request
import socket
import MySQLdb# 用于显示的图片的路径
IMAGE_PATH = '.\\pic\\chepai.jpg'
host = "192.168.43.161:8080"# 对应树莓派上开启的地址
if len(sys.argv)>1:host = sys.argv[1]
hoststr = 'http://' + host + '/?action=stream'
print('Streaming ' + hoststr)stream=urllib.request.urlopen(hoststr)
bytes=b''class Surface(ttk.Frame):pic_path = ""viewhigh = 600viewwide = 600update_time = 0thread = Nonethread_run = Falsecamera = Nonecolor_transform = {"green":("绿牌","#55FF55"), "yello":("黄牌","#FFFF00"), "blue":("蓝牌","#6666FF")}def __init__(self, win):ttk.Frame.__init__(self, win)frame_left = ttk.Frame(self)frame_right1 = ttk.Frame(self)frame_right2 = ttk.Frame(self)win.title("车牌识别")win.state("zoomed")self.pack(fill=tk.BOTH, expand=tk.YES, padx="5", pady="5")frame_left.pack(side=LEFT,expand=1,fill=BOTH)frame_right1.pack(side=TOP,expand=1,fill=tk.Y)frame_right2.pack(side=RIGHT,expand=0)ttk.Label(frame_left, text='原图:').pack(anchor="nw") ttk.Label(frame_right1, text='车牌位置:').grid(column=0, row=0, sticky=tk.W)from_pic_ctl = ttk.Button(frame_right2, text="来自图片", width=20, command=self.from_pic)from_vedio_ctl = ttk.Button(frame_right2, text="来自摄像头", width=20, command=self.from_vedio)self.image_ctl = ttk.Label(frame_left)self.image_ctl.pack(anchor="nw")self.roi_ctl = ttk.Label(frame_right1)self.roi_ctl.grid(column=0, row=1, sticky=tk.W)ttk.Label(frame_right1, text='识别结果:').grid(column=0, row=2, sticky=tk.W)self.r_ctl = ttk.Label(frame_right1, text="")self.r_ctl.grid(column=0, row=3, sticky=tk.W)self.color_ctl = ttk.Label(frame_right1, text="", width="20")self.color_ctl.grid(column=0, row=4, sticky=tk.W)from_vedio_ctl.pack(anchor="se", pady="5")from_pic_ctl.pack(anchor="se", pady="5")self.predictor = predict.CardPredictor()self.predictor.train_svm()def get_imgtk(self, img_bgr):img = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)im = Image.fromarray(img)imgtk = ImageTk.PhotoImage(image=im)wide = imgtk.width()high = imgtk.height()if wide > self.viewwide or high > self.viewhigh:wide_factor = self.viewwide / widehigh_factor = self.viewhigh / highfactor = min(wide_factor, high_factor)wide = int(wide * factor)if wide <= 0 : wide = 1high = int(high * factor)if high <= 0 : high = 1im=im.resize((wide, high), Image.ANTIALIAS)imgtk = ImageTk.PhotoImage(image=im)return imgtkdef show_roi(self, r, roi, color):if r :roi = cv2.cvtColor(roi, cv2.COLOR_BGR2RGB)roi = Image.fromarray(roi)self.imgtk_roi = ImageTk.PhotoImage(image=roi)self.roi_ctl.configure(image=self.imgtk_roi, state='enable')self.r_ctl.configure(text=str(r))self.update_time = time.time()try:c = self.color_transform[color]self.color_ctl.configure(text=c[0], background=c[1], state='enable')except: self.color_ctl.configure(state='disabled')elif self.update_time + 8 < time.time():self.roi_ctl.configure(state='disabled')self.r_ctl.configure(text="")self.color_ctl.configure(state='disabled')def from_vedio(self):if self.thread_run:returnif self.camera is None:self.camera = cv2.VideoCapture(0)if not self.camera.isOpened():mBox.showwarning('警告', '摄像头打开失败!')self.camera = Nonereturnself.thread = threading.Thread(target=self.vedio_thread, args=(self,bytes))self.thread.setDaemon(True)self.thread.start()self.thread_run = Truedef from_pic(self):self.thread_run = Falseself.pic_path = askopenfilename(title="选择识别图片", filetypes=[("jpg图片", "*.jpg")])if self.pic_path:img_bgr = predict.imreadex(self.pic_path)self.imgtk = self.get_imgtk(img_bgr)self.image_ctl.configure(image=self.imgtk)r, roi, color = self.predictor.predict(img_bgr)combine(r)self.show_roi(r, roi, color)@staticmethoddef vedio_thread(self,bytes):self.thread_run = Truepredict_time = time.time()while self.thread_run:# _, img_bgr = self.camera.read()# self.imgtk = self.get_imgtk(img_bgr)# self.image_ctl.configure(image=self.imgtk)# if time.time() - predict_time > 2:# 	r, roi, color = self.predictor.predict(img_bgr)# 	self.show_roi(r, roi, color)# 	predict_time = time.time()bytes += stream.read(1024)a = bytes.find(b'\xff\xd8')b = bytes.find(b'\xff\xd9')if a != -1 and b != -1:jpg = bytes[a:b + 2]bytes = bytes[b + 2:]# flags = 1 for color image# 来自网页的摄像头数据frame = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8), flags=1)self.imgtk = self.get_imgtk(frame)self.image_ctl.configure(image=self.imgtk)if time.time() - predict_time > 2:r, roi, color = self.predictor.predict(frame)if len(r):print('OK')combine(r)cv2.imwrite(IMAGE_PATH, frame)	# 保存当前识别的图片image = cv2.imread(IMAGE_PATH)cv2.imshow('img', image)self.show_roi(r, roi, color)  cv2.waitKey()predict_time = time.time()print("run end")def close_window():print("destroy")if surface.thread_run :surface.thread_run = Falsesurface.thread.join(2.0)win.destroy()def combine(r):# 把数组中的字组合起来result = ""for data in r:result += datasend_message(result)send_mysql(result)def send_message(result):try:print('result:', result)if result:client.send(result.encode(encoding='utf-8'))  # 不能发空的东西,需要变成utf-8编码形式print('OK')except Exception:client.close()def send_mysql(result):if result:print('OK5')#连接cxn = MySQLdb.Connect(host = '127.0.0.1', port = 3306, user = 'root', passwd = '12345678', charset="utf8")#游标cur = cxn.cursor()cur.execute("USE che1") #首先得运行mysql.py 或者直接在MySQL上创建表#查询cur.execute("SELECT * FROM users where name='{}'".format(result))#定义查询items =cur.fetchall() #获取查询到数据#将结果集强转为listitems = list(items)fw=open('F:\\python\\web端\\flaskweb\\flaskweb\\web.txt','w') #对应web端的直接路径for t in items:fw.write(' '.join(str(s) for s in t) + '\n')fw.close()#print("保存文件成功")#关闭cur.close()#关闭游标cxn.commit()#提交事务cxn.close()#释放数据库资源在这里插入代码片if __name__ == '__main__':client = socket.socket()  # 有一些默认参数,即可使用ipv4,这一句是声明socket类型和返回socket连接对象client.connect(("192.168.43.161", 12348))win = tk.Tk()surface = Surface(win)win.protocol('WM_DELETE_WINDOW', close_window)win.mainloop()

2.predict.py参照之前大佬博客,定位矫正切割识别这部分就改参数,其他不改动
3.mysql.py

import MySQLdb#连接
cxn = MySQLdb.Connect(host = '127.0.0.1', port = 3306, user = 'root', passwd = '12345678', charset="utf8")
#游标
cur = cxn.cursor()try:cur.execute("DROP DATABASE che1")
except Exception as e:print(e)
finally:pass#创建数据库
cur.execute("CREATE DATABASE che1")
cur.execute("USE che1")#创建表
cur.execute("CREATE TABLE users (id INT, name VARCHAR(255), username VARCHAR(255), sex VARCHAR(10), birth TIMESTAMP, telephone VARCHAR(20))")
#插入
cur.execute("INSERT INTO users VALUES(1, '闽A77518', '李明', '男', '1993-06-05 15:20:00', 13758546621),(2, '皖A87271', '张三', '女', '1993-04-03', 15487596721)")
#查询
cur.execute("SELECT * FROM users where name='闽A77518'")
for row in cur.fetchall():print('%s\t%s\t%s\t%s\t%s\t%s' %row)#关闭
cur.close()
cxn.commit()
cxn.close()

web端
1.flaskweb.py

# _*_ coding:utf-8 _*_import cv2
from flask import Flask, render_template# 用于显示的图片的路径
IMAGE_PATH = '.\\static\\img\\chepai.jpg'app = Flask(__name__)	#程序实例是Flask的对象,一般情况下用如下方法实例化,Flask类只有一个必须指定的参数,即程序主模块或者包的名字,__name__是系统变量,该变量指的是本py文件的文件名"""@app.route("/")	#当与前端约定好路由接口路径时会自动执行下方的index函数
def index():return render_template("index.html")	#将参数返回到index.html里@app.route("/charts/")
def charts():return render_template("charts.html")@app.route("/faq/")
def faq():return render_template("faq.html")@app.route("/grid/")
def grid():return render_template("grid.html")@app.route("/test",methods=['GET'])	#与ajax方法的url协定统一路径,使用get无加密方法
def test():fw=open('web.txt','r')da = fw.read()   #读取文件#print(d)if da.strip()=='':da=('数据库中未有信息')#print(d)return daif __name__ == '__main__':app.run(host='192.168.43.161',	#本地IPport= 2222,	#端口号)

2.同目录下templates文件夹下html

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8" /><title>车牌识别门禁系统</title><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /><meta name="apple-mobile-web-app-capable" content="yes" />    <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/bootstrap-responsive.min.css') }}"><link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/font-awesome.css') }}"><link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/adminia.css') }}"><link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/bootstrap.min.css') }}"><link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/pages/plans.css') }}"><!-- Le HTML5 shim, for IE6-8 support of HTML5 elements --><!--[if lt IE 9]><script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script><![endif]--><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><script language="javascript">//页面加载调用window.onload=function(){//每1秒刷新时间setInterval("NowTime()",1000);}function NowTime(){var myDate=new Date();var y = myDate.getFullYear();var M = myDate.getMonth()+1;     //获取当前月份(0-11,0代表1月)var d = myDate.getDate();        //获取当前日(1-31)var h = myDate.getHours();       //获取当前小时数(0-23)var m = myDate.getMinutes();     //获取当前分钟数(0-59)var s = myDate.getSeconds();     //获取当前秒数(0-59)//检查是否小于10M=check(M);d=check(d);h=check(h);m=check(m);s=check(s);var timestr = y+"-"+M+"-"+d+" "+h+":"+m+":"+s;document.getElementById("nowtime").innerHTML="当前时间:" + timestr;}//时间数字小于10,则在之前加个“0”补位。function check(i){var num = (i<10)?("0"+i) : i;return num;}</script></head><body><div class="navbar navbar-fixed-top"><div class="navbar-inner"><div class="container"><a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> 				</a><a class="brand" href="./">车牌识别门禁系统web端</a></div> <!-- /container --></div> <!-- /navbar-inner --></div> <!-- /navbar --><div id="content"><div class="container"><div class="row"><div class="span3"><div class="account-container"><div class="account-avatar"><img src="{{ url_for('static', filename='img/headshot.png') }}" alt="" class="thumbnail" /></div> <!-- /account-avatar --><div class="account-details"><span class="account-name">引觞垂月</span><span class="account-role">人间清欢不觉淡 谁知其味漫</span></div> <!-- /account-details --></div> <!-- /account-container --><hr />				<ul id="main-nav" class="nav nav-tabs nav-stacked">	<li><a href="./"><i class="icon-home"></i>首页 			</a></li><li><a href="/charts/"><i class="icon-signal"></i>图片	</a></li><li><a href="/faq/"><i class="icon-th-list"></i>视频</a></li><li><a href="/grid"><i class="icon-th-large"></i>历史文学	</a></li><li>	<i class="icon-home"></i>目的:			</li></ul>	<hr /><div class="sidebar-extra"><p>将车牌识别结果导入数据库里查询车主信息</p></div> <!-- .sidebar-extra --><br /></div> <!-- /span3 --><div class="span9"><h1 class="page-title"><i class="icon-th-list"></i>车主信息					</h1><div class="widget"><div class="widget-header"><h3>对应信息为:	序号 车牌号 车主名  性别     出生时间      联系方式</h3></div> <!-- /widget-header --><div class="widget-content"><div class="pricing-plans plans-3"><div id="ajaxDiv" style="margin-top: 20px"></div></div> <!-- /pricing-plans --></div> <!-- /widget-content --></div> <!-- /widget --><div class="widget"><div class="widget-header"><h3>时间</h3></div> <!-- /widget-header --><div class="widget-content"><div id="nowtime">在这里显示时间</div></div> <!-- /widget-content --></div> <!-- /widget --></div> <!-- /span9 --></div> <!-- /row --></div> <!-- /container --></div> <!-- /content --><!-- Le javascript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="{{ url_for('static', filename='js/jquery-1.7.2.min.js') }}"></script><script src="{{ url_for('static', filename='js/bootstrap.js') }}"></script></body>
</html><script type="text/javascript">setInterval(function(){$.ajax({type:"get",dataType:'text',url:"/test",cache:false,success:function(data){$("#ajaxDiv").html(data);},error:function(){alert("失败,请稍后再试!");}});},1000);</script>

树莓派上运行rpi.py

import socket
import tkinter as tk
import threading
import MySQLdb
import RPi.GPIO
import timetime_out=5
RELAY=18def get_message(conn):while True:data = conn.recv(1024)#if not data :#print('this user is end,exit!\n next user')#breakif data:print('data:',data.decode())var.set(data.decode())l = tk.Label(win,textvariable=var,font=('Arial', 30),width=30,height=10).pack(side='right')#         #连接cxn = MySQLdb.Connect(host = '127.0.0.1', port = 3306, user = 'root', passwd = '123456', charset="utf8")#游标cur = cxn.cursor()cur.execute("USE che1")#查询cur.execute("SELECT * FROM users where name='{}'".format(data.decode()))#定义查询d=cur.fetchall()  #fetchall:接收全部的返回结果行if len(d)>0:RPi.GPIO.setmode(RPi.GPIO.BCM)RPi.GPIO.setup(RELAY,RPi.GPIO.OUT)RPi.GPIO.output(RELAY,RPi.GPIO.HIGH)time.sleep(time_out)RPi.GPIO.output(RELAY,RPi.GPIO.LOW)time.sleep(time_out)RPi.GPIO.cleanup()#关闭cur.close()cxn.commit()cxn.close()server = socket.socket()
server.bind(("192.168.43.197",12348)) #绑定要监听的端口port
server.listen(5) # 监听,这里表示最多有5个客户端连接服务器,python2不好使
print('waiting the call')
conn,addr = server.accept() # 等电话打进来,每个conn代表一个客户端的连接
print(conn)
print('the call has comming')thread = threading.Thread(target = get_message, args = (conn, ))
thread.start()win = tk.Tk()
win.title('chepai')
win.geometry('960x800')
tk.Label(win, text='车牌号',font=('Arial', 30),width=30,height=10).pack(side='left')#左
var = tk.StringVar()win.mainloop()

Android通过tcp/ip控制gpio从而控制继电器,源码就不贴了,需要的可以去链接下了看看

硬件

1、Raspberry Pi 3B 嵌入式开发板(系统烧写、配置、驱动)
2、7 寸 LCD 触摸屏
3、CSI 摄像头模块(用USB摄像头也行)
4、继电器模块

效果演示

具体效果视频是当时线上答辩演示时拍的,放在b站上。由于懒写论文就没加Android手动控制,反正也无伤大雅 演示视频.

就后面增加的Android就是类似聊天框通信的那种,很简单界面布置,就当测试用。切记,本人比较懒,IP写死了,需要同一局域网下。
界面如下Android

后记

前后大概用了20多天的时间,后面会陆续将每天的工作日记写上来。如果有什么错误或者问题,我应该大部分都有遇到,希望能解决各位心中的疑惑。本来想做到服务器上的,可惜腾讯云太坑了硬是域名解析不了,虽说这个东西只需要到本地局域网就可以了但还是很想过个瘾,只能说小小的遗憾咯~
最后,七夕到处浪,写博客它不香吗
人间清欢不觉淡,谁知其味漫,各位七夕快乐!


http://www.ppmy.cn/news/554958.html

相关文章

用Python拨打电话

用python拨打电话&#xff0c;先看小视频 Python自动化技术广泛应用于测试、运维相关领域&#xff0c;我自己现在也是做的这方面&#xff0c;工资也不比其他方向少&#xff0c;就业相对容易的多&#xff0c;而且需求的公司也多&#xff0c;对后端框架之类也要求不是很高&#x…

java——反射与注解

文章目录 Java反射基础1. 概念详解2. 示例代码 Java反射进阶1. 框架设计2. 动态代理3. 模板方法 Java注解基础1. 概念2. 基本语法3. 自定义注解4. 反射获取注解信息 Java注解进阶1. 应用场景2. 内置注解3. 第三方注解库4. 总结 Java反射与注解实战1. 实战场景2. 代码实现 Java反…

【Java 基础篇】Java 修饰符:掌握代码的灵魂之钥

文章目录 导言一、访问修饰符二、非访问修饰符1、final修饰符2、static修饰符3、abstract修饰符4、synchronized修饰符 三、修饰符的组合使用总结 导言 在Java编程中&#xff0c;修饰符是一种关键元素&#xff0c;用于控制类、方法、变量和构造函数的访问性、行为和特性。Java…

深入地下,实地探访!不用人挖煤的智能煤矿长什么样?

来源&#xff1a;脑极体 未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&#xff08;城市&#xff09;云脑研究计划&#xff0c;构建互联网&#xff08;城市&#xff09;云脑技术和企业图谱&…

煤泥水处理方法

1.一种煤泥水处理方法&#xff0c;其特征在于&#xff1a;包括以下步骤&#xff1a; (1)、将煤炭洗选后的煤泥水通过管道输送到洗煤厂内的底流浓缩池&#xff0c;向底流浓缩池内加入絮凝剂将煤泥水浓缩&#xff0c;使得煤泥水中的含固量达到300&#xff5e;400g/L; (2)、将浓缩…

浅谈智慧矿山之智慧矿山建设的目的

自从王国法院士向国家提出智慧矿山建设的时间规划之后&#xff0c;在煤矿系统的圈子里&#xff0c;大家交流最多的就是智能化、智慧化&#xff0c;谁都可以讲几句&#xff0c;说点东西出来。但是我们为什么要建设智慧矿山呢&#xff1f;很多人也在问&#xff0c;很多回答都是见…

搞IT就像挖煤一样

从19世纪70年代开始&#xff0c;一直到20世纪30年代的大萧条时期&#xff0c;煤矿工人都在忍受着雇主们的剥削。煤炭公司极大地剥削工人以获取最大利益&#xff1a;工作环境复杂多变&#xff0c;有些地方简陋不堪甚至极度危险。工资由工人从矿场里开采出的煤炭重量决定&#xf…

挖空的煤矿能否储存石油

挖空的煤矿能否储存石油 红朝儒生 2016-9-3 关键字&#xff1a;煤矿 存储 石油 简介&#xff1a;挖空的煤矿&#xff0c;会形成塌陷区&#xff0c;带来各种灾害和破坏。能不能利用起来存储石油&#xff1f; 中国是个煤矿大国&#xff0c;从改开以来大量开采&#xff0c;包括取…

一次挖矿入侵处理记录(2021.01.27)

https://github.com/bg6cq/ITTS/blob/master/security/mine/README.md 转自上面链接&#xff0c;也是我的亲身经历&#xff0c;供大家学习。网络安全大家引以为戒。爱闹的小兄弟们&#xff0c;别闹了啊&#xff0c;让张老师花了好几天的心思在你们弄得事情上。 [原创]一次挖矿…

简单聊聊煤炭行业的数字化和可持续发展

煤在普通人的心目中是一种能引起复杂感情的东西。我们喜欢它在冬天给我们带来温暖&#xff0c;我们不喜欢它因为它黢黑黢黑的&#xff0c;沾在身上特别黑&#xff0c;看起来脏兮兮的。在笔者的记忆中&#xff0c;小时候煤可是生活的必需品。 小时候在冬天的河北必须要生炉子&a…

挖煤(coal)

挖煤&#xff08;coal&#xff09; solution 我好弱&#xff0c;啥也想不到。 想了很久dp&#xff0c;这有后效性啊。 结果倒着做就可以了&#xff0c;因为后面的不会影响前面的。 考虑前面的影响后面&#xff1a;挖煤相当于让后面所有a[I]*(1k%) #include<cstdio> …

我的一些实战的漏洞挖掘过程(一)

最近挖到的漏洞&#xff0c;在这里分享一下&#xff0c;有些信息比较敏感就打码处理&#xff0c;目标网站都换为target.com 反射xss漏洞挖掘 跨站脚本攻击&#xff08;Cross-site Scripting&#xff0c;XSS&#xff09;是一种常见的Web安全漏洞&#xff0c;攻击者通过在Web应…

甘肃非煤矿山电子封条 智慧矿山 opencv

甘肃非煤矿山电子封条 智慧煤矿接入国家矿山安全平台是通过pythonopencv网络模型&#xff0c;甘肃非煤矿山电子封条pythonopencv网络模型对关键位置&#xff08;回风井口、运人井口、车辆出入口&#xff09;对现场人员行为、数量、穿戴着装及设备状态各数据进行实时监控分析。p…

关于漏洞挖掘

漏洞挖掘 各平台提交规则 1. CNVD&#xff1a;有归属的一般都收&#xff0c;没有实质性危害的不收 2. 补天&#xff1a;百度权重或者移动权重大于等于才可以收录&#xff08;满足两者一点就行&#xff09; 3. 漏洞盒子&#xff1a;门槛比较低&#xff0c;一般有明确归属感就收…

选矿选煤知识介绍

中国是世界上疆域辽阔、成矿地质条件优越、矿种齐全配套、资源总量丰富的国家&#xff0c;是具有自己资源特色的一个矿产资源大国。 中国矿业资源的主要特点&#xff1a;我国矿产资源既有优势&#xff0c;也有劣势。优劣并存的基本态势主要表现在以下几个方面&#xff1a; 1、…

过去挖煤,现在挖什么?李彦宏的家乡正在发生这些变化

如今数据已经成为信息时代的基础支撑&#xff0c;是各个行业不可或缺的重要能源。而作为传统煤炭资源大省&#xff0c;山西为了彻底摆脱对煤炭产业的过度依赖&#xff0c;在国家相关政策支持下正在发生着重大变化&#xff0c;大数据产业正在成为山西省转型的重要支点&#xff0…

太阳上挖煤的可行性报告

随着我们伟大祖国建设的飞速发展&#xff0c;能源问题日益突出&#xff0c;要发展&#xff0c;我们就要开发新的能量来源&#xff0c;在此&#xff0c;我郑重提出&#xff1a;向太阳进军&#xff01;向太阳要能源&#xff01;在太阳上挖煤&#xff01;  本报告分三个部分&…

5G下矿井,煤炭行业进入“智”时代

煤炭行业是我国重要的传统能源行业&#xff0c;其发展建设直接关系我国国民经济和社会智能化进程。作为典型的劳动力密集产业&#xff0c;煤炭行业用工成本逐年攀升&#xff0c;安全问题日益突出&#xff0c;智能化、安全化、无人化操作成为了每一个煤矿业人的期盼。 ▼ 当前…

开辟预言机噺思路|挖ADAMoracle矿商的珍馐美馔

开辟预言机噺思路|挖ADAMoracle矿商的珍馐美馔 DeFi 是过去一年整个区块链世界发展最为迅速的领域&#xff0c;且呈现出成熟稳步增长的态势&#xff0c;预言机作为其中的中间件&#xff0c;发挥着重要作用。它对内承载了智能合约的数据的流转和使用&#xff0c;对外打破了链下…

Android手机root刷机教程:三星I9003手机如何快速获取ROOT权限,小三们不会ROOT的请看过来,手把手图文教程帮你ROOT手机

上次我写了一篇文章&#xff0c; “ google play电子市场和gmail如何安装在国产手机、三星手机、摩托手机里” 大家好多人找到我&#xff0c;问手机如何ROOT的&#xff0c;当然了三星用户居多&#xff0c;我的手机就是三星I9003&#xff0c;版本信息如下&#xff1a; 下面&…