赞
踩
1.利用python爬虫爬取(也可以手动收集)图片集,分为pos(正相关,要识别的)和neg(负相关,里面没有pos,一般是背景之类的无关图)一般1:3即可,笔主这里准备500:1500.
爬虫随便搜一个就行,忘了从哪个大佬那里copy的了(仅供参考侵删) 里面 地面 是搜索词,替换即可,倒数第三行改一下路径即可。
- import time
- import requests
- import urllib
-
- page = input("请输入要爬取多少页:")
- page = int(page) + 1 # 确保其至少是一页,因为 输入值可以是 0
- header = {
- 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
- }
- n = 0 # 图片的前缀 如 0.png
- pn = 1 # pn是从第几张图片获取 百度图片下滑时默认一次性显示30张
- for m in range(1, page):
- url = 'https://image.baidu.com/search/acjson?'
- param = {
- 'tn': 'resultjson_com',
- 'logid': '8846269338939606587',
- 'ipn': 'rj',
- 'ct': '201326592',
- 'is': '',
- 'fp': 'result',
- 'queryWord': '地面',
- 'cl': '2',
- 'lm': '-1',
- 'ie': 'utf-8',
- 'oe': 'utf-8',
- 'adpicid': '',
- 'st': '-1',
- 'z': '',
- 'ic': '',
- 'hd': '',
- 'latest': '',
- 'copyright': '',
- 'word': '地面',
- 's': '',
- 'se': '',
- 'tab': '',
- 'width': '',
- 'height': '',
- 'face': '0',
- 'istype': '2',
- 'qc': '',
- 'nc': '1',
- 'fr': '',
- 'expermode': '',
- 'force': '',
- 'cg': 'girl',
- 'pn': pn,
- 'rn': '30',
- 'gsm': '1e',
- }
- page_info = requests.get(url=url, headers=header, params=param)
- page_info.encoding = 'utf-8' # 确保解析的格式是utf-8的
- page_info = page_info.json() # 转化为json格式在后面可以遍历字典获取其值
- info_list = page_info['data'] # 观察发现data中存在 需要用到的url地址
- del info_list[-1] # 每一页的图片30张,下标是从 0 开始 29结束 ,那么请求的数据要删除第30个即 29为下标结束点
- img_path_list = []
- for i in info_list:
- img_path_list.append(i['thumbURL'])
- for index in range(len(img_path_list)):
- print(img_path_list[index]) # 所有的图片的访问地址
- time.sleep(1)
- urllib.request.urlretrieve(img_path_list[index], "D:/Awangyefu/" + str(n) + '.jpg')
- n = n + 1
-
- pn += 29
有改动的话,改名
- import os
-
- files = os.listdir("D:/python_work/mongfang_xml/pos/")#原来文件夹的路径
- i = 0
-
- for file in files:
- original = "D:/python_work/mongfang_xml/pos/" + os.sep + files[i]
- #修改后放置图片的路径 F:/ns,也可将 img_ 换成其他标注
- new = "D:/python_work/mongfang_xml/pos1/" + os.sep + str(i + 1) + ".jpg"
- os.rename(original, new)
- i += 1
灰度处理
- #处理正样本
- import cv2
- path = "C:/pos/" #pos文件所在地址
- for i in range(1, 27): #pos文件中图片数量
- print(path+str(i)+'.jpg')
- img = cv2.imread(path+str(i)+'.jpg', cv2.IMREAD_GRAYSCALE)
- img5050=cv2.resize(img,(50,50)) #将pos文件中图片压缩为50*50
- cv2.imshow("img", img5050)
- cv2.waitKey(20)
- cv2.imwrite('C:/pos1/'+str(i)+'.jpg', img5050)
-
- #处理负样本
- import cv2
- path = "C:/neg/"
- for i in range(1, 30):
- print(path+str(i)+'.jpg')
- img = cv2.imread(path+str(i)+'.jpg', cv2.IMREAD_GRAYSCALE)
- cv2.imwrite('C:/neg1/'+str(i)+'.jpg', img)
2.创建正负样本txt,将正样本图片压缩,和将正负样本灰度处理后,在文件夹中生成它们的路径图txt(不知道叫啥)
点击目录,输入cmd进入命令行控制器,输入
dir /b >pos.txt
3.修改正负样本txt,通过python写个程序(3,4合并)或者sublime给txt文件添加路径和正样本添加调整大小。
- import os
- def create_pos_n_neg():
- for file_type in ['pos']: #运行一次之后修改pos为neg
- for img in os.listdir(file_type):
- if (file_type == 'neg'):
- line = file_type + '/' + img + '\n'
- with open('neg.txt', 'a') as f:
- f.write(line)
- elif (file_type == 'pos'):
- line = file_type + '/' + img + ' 1 0 0 50 50\n'
- with open('pos.txt', 'a') as f:
- f.write(line)
-
- if __name__ == '__main__':
- create_pos_n_neg()
4.创建vec文件
点击根目录,输入构造
opencv_createsamples -vec pos.vec -info pos.txt -bg neg.txt -w 50 -h 50
注意:如果报错如读取不到图片pos\pos.txt,把pos.txt文件中最后一行带txt的删掉即可
如果警告无法启动此程序,因为计算机丢失opencv_..balabala,就搜这个,添加到环境配置PATH中即可。
5.文件夹中创建data文件夹,点击根目录,输入构造
opencv_traincascade -data data -vec pos.vec -bg neg.txt -numPos 500 -numNeg 1500 -numStages 15 -featureType LBP -w 50 -h 50 -minHitRate 0.9999 -maxFalseAlarmRate 0.5
6.得到xml文件
python中运行即可
- import cv2
- def detect():
- print("识别项目")
- cascade_xpider=cv2.CascadeClassifier("./data/cascade.xml")
- cap=cv2.VideoCapture(0)
- # cv2.nameWindow("camera")
- while True:
- ret,frame=cap.read()
- # frame=cv2.resize(frame,(320,240))
- gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
- xpiders=cascade_xpider.detectMultiScale(gray, 1.1, 20, cv2.CASCADE_SCALE_IMAGE, (100, 100),
- (150, 150))
- for (x,y,w,h) in xpiders:
- cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)
-
- cv2.imshow("camera",frame)
- if cv2.waitKey(10)& 0xFF == ord("q"):
- break
- cap.release()
- cv2.desstoryAllWindows()
-
- detect()
效果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。