python 还有很多的功能和特色在这里并没有涉及,比如类和函数的高级用法,进程和线程,io,异常处理、库、程序界面设计、程序打包和发布等,数据结构方面的栈,队列,链表,图,网络等,算法方面也没有涉及,不是这些知识不重要,而是对于初学者而言,系统的掌握最核心的基础知识更为紧迫,在某个方面钻的太深不利于入门。
掌握基本的数据类型,才是重中之重,学会用基本的数据类型表达问题,在经过简单的步骤达到编程的目的,会大大加强学习的信心和效率。如何把数据结构的知识,与切片,计算,循环,函数,和类融为一体?只有通过多练习,多实验,多思考,多验证,多搜索,多借鉴,多总结来实现。
python 拥有十分庞大的知识体系,基本语法,基本的思想是一致的。入门python编程是一项艰苦的工作,前进的道路上会遇到各种问题,各种报错,各种表达上的结结巴巴,思路上的茫然。兴趣是最好的老师,我本人之前也是对python一窍不通的,为了解决视觉定位问题,开始学习opencv库,尝试神经网络,学习cnc,plc 等工控知识。一路下来发现所用的方案都可以包含在python 的体系里,我发现一套可行的方案并不需要所有的知识,理解基本数据类型,理解数据切片,理解程序控制就完全能够读懂别人的方案,并加以修改实现自己的目标。
确定方向,确定目标太重要了。
python 如果是一个超市,假如你决定包一顿饺子,你只需要购买大肉,生葱,少许青菜和饺子皮就够了,而其他的你并不需要了解太多。事实上,python不是超市,python是一座大城市,里面有各种各样的市场和超市。
github 上有很多和你有共同兴趣的人,也有丰富的代码资源,借鉴他们的经验或许能让你进步更快。
我希望有更多用代码和实验思考的人,这些人改造了时代,改造了人们对未来的想象。
文末附上几个有趣的例程,不一定能通过调试,希望为你的入门增加一些兴趣。
**********没有界面的电子琴***********
import pygame
def window_init():
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((800, 800))
pygame.display.set_caption('keyboardpiano')
window_init()
tone_1 = pygame.mixer.Sound('1.wav')
tone_2 = pygame.mixer.Sound('2.wav')
tone_3 = pygame.mixer.Sound('3.wav')
tone_4 = pygame.mixer.Sound('4.wav')
tone_5 = pygame.mixer.Sound('5.wav')
tone_6 = pygame.mixer.Sound('6.wav')
tone_7 = pygame.mixer.Sound('7.wav')
tone_8 = pygame.mixer.Sound('8.wav')
tone_9 = pygame.mixer.Sound('9.wav')
tone_10 = pygame.mixer.Sound('10.wav')
tone_11 = pygame.mixer.Sound('11.wav')
tone_12 = pygame.mixer.Sound('12.wav')
tone_13 = pygame.mixer.Sound('13.wav')
tone_14 = pygame.mixer.Sound('14.wav')
tone_15 = pygame.mixer.Sound('15.wav')
tone_16 = pygame.mixer.Sound('16.wav')
tone_17 = pygame.mixer.Sound('17.wav')
tone_18 = pygame.mixer.Sound('18.wav')
tone_19 = pygame.mixer.Sound('19.wav')
tone_20 = pygame.mixer.Sound('20.wav')
tone_21 = pygame.mixer.Sound('21.wav')
tone_22 = pygame.mixer.Sound('22.wav')
tone_23 = pygame.mixer.Sound('23.wav')
def k_control():
while True:
print('true')
for event in pygame.event.get():
print('event in?')
if event.type == pygame.QUIT:
pygame.quit()
elif event.type == pygame.KEYDOWN:
print('key down?')
if event.key == pygame.K_q:
tone_1.play()
elif event.key == pygame.K_a:
tone_2.play()
elif event.key == pygame.K_z:
tone_3.play()
elif event.key == pygame.K_w:
tone_4.play()
elif event.key == pygame.K_s:
tone_5.play()
elif event.key == pygame.K_x:
tone_6.play()
elif event.key == pygame.K_e:
tone_7.play()
elif event.key == pygame.K_d:
tone_8.play()
elif event.key == pygame.K_c:
tone_9.play()
elif event.key == pygame.K_r:
tone_10.play()
elif event.key == pygame.K_f:
tone_11.play()
elif event.key == pygame.K_v:
tone_12.play()
elif event.key == pygame.K_t:
tone_13.play()
elif event.key == pygame.K_g:
tone_14.play()
elif event.key == pygame.K_b:
tone_15.play()
elif event.key == pygame.K_y:
tone_16.play()
elif event.key == pygame.K_h:
tone_17.play()
elif event.key == pygame.K_n:
tone_18.play()
elif event.key == pygame.K_u:
tone_19.play()
elif event.key == pygame.K_j:
tone_20.play()
elif event.key == pygame.K_m:
tone_21.play()
elif event.key == pygame.K_i:
tone_22.play()
elif event.key == pygame.K_k:
tone_23.play()
pygame.display.update()
def main():
k_control()
if __name__ == '__main__':
main()
声音文件的下载地址:链接:https://pan.baidu.com/s/1V6N-wnU9n3t3UuohlhYynw?pwd=q6ff
提取码:q6ff
**********用python 读gcode 文件通过串口控制3d打印机***********
import serial
from timeimport sleep
import re
#ser = serial.Serial('/dev/ttyACM11', 250000, timeout=0.1) # 打开USB0口 串口号ttyACM0 波特率115200 超时2秒
ser = serial.Serial('COM11', 250000, 8, 'N', 1) #这个串口编号和波特率要与机器匹配
flag = ser.is_open
if flag:
print('成功打开串口\n')
#ser.close()
else:
print('Open Error\n')
#ser.close()
ser.timeout =40 # 读超时设置
ser.writeTimeout =2 # 写超时
'''
line = '$G\n' # 查看信息命令print(line) # 打印命令数据cmd = line.encode() # 对数据unicode编码成bytes
ser.write(cmd) # 发送命令data = ser.readline() # 读取返回数据 10s超时print(data) # 打印返回数据'''
f =open("D:/pythonlianxi1/image/5555.gcode", 'r')# 只读模式打开文档打开Gcode文档,
#couter = 0
while True:
line = f.readline()# 按行读取
if not line:# 读到最后文档结尾
f.close()# 关闭文档
break # 退出循环
print("文件行:",line)# 打印数据
cmd = line.encode()# 对数据unicode编码成bytes
ser.write(cmd)# 发送命令
data = ser.readline()# 读取返回数据 10s超时
print("打印机返回",data)# 打印返回数据
print('发送完成')
#couter = couter + 1
#sleep(0.2)
ser.close()
*********运用opencv 方法寻找图像元素中心点的坐标************
import cv2 as cv
import numpy as np
def measure_object(image):
image2 = cv.resize(image, (180, 180), interpolation=cv.INTER_AREA)
gray = cv.cvtColor(image2, cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 100, 255, cv.THRESH_BINARY_INV)
cv.namedWindow("2zhi", cv.WINDOW_AUTOSIZE)
cv.imshow("2zhi", binary)
#dst = cv.cvtColor(binary, cv.COLOR_GRAY2BGR)
contours, hireachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
j = 0
for contour in enumerate(contours):
j = j + 1
zhongxindian = [[0 for i in range(2)] for i in range(j)]
for i, contour in enumerate(contours):
area = cv.contourArea(contour)
print(f'面积{i + 1}是:{area}')
x, y, w, h = cv.boundingRect(contour)
rate = min(w, h)/max(w, h)
mm = cv.moments(contour)
if mm['m00'] != 0:
cx = mm['m10']/mm['m00']
cy = mm['m01']/mm['m00']
else:
cx = x-h/2
cy = y+w/2
ccx = np.int(cx)
ccy = np.int(cy)
zhongxindian[i][0] = ccx
zhongxindian[i][1] = ccy
#print("中心点集合:", zhongxindian)
return zhongxindian
src = cv.imread("D:/vcprojects/images/sanjiaodian.jpg") #图像元素不要太多
#cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
#cv.imshow("input image", src)
dj = measure_object(src)
print(dj)
cv.waitKey(0)
cv.destroyAllWindows()
********图片探针*********
import cv2 as cv
import numpy as np
# 定义标注函数,判断图片小片是否为目标物体
def Bz(imagesmall):
k = imagesmall #imagesmall在主程序中已经二值化
tanzhen = 0
jifen = 0
biaozhu = False
# 小片视为5*5的宫格,这里取最中间的一块进行判断:左上角开始,沿对角线取10个点,有四个为目标颜色即标注为true,最好是连续的目标 点todo
for i in range(5):
jifen = k[i][i]/255
tanzhen+=jifen #如果这个点上的颜色非黑色则计入积分
if tanzhen >=2:
biaozhu = True
else :
biaozhu = False
return biaozhu
src = cv.imread('wu.png',1)
# cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
# cv.imshow("input image", src)
dim = (200,200)
src = cv.resize(src, dim, interpolation = cv.INTER_AREA)
gray = cv.cvtColor(src,cv.COLOR_BGR2GRAY)
ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY | cv.THRESH_OTSU)
# cv.namedWindow("erzhi image", cv.WINDOW_AUTOSIZE)
# cv.imshow("erzhi image", binary)
cw = 5
ch = 5
h,w = binary.shape[:2]
for row in range(0,h,ch):
for col in range(0,w,cw):
roi = binary[row:row+ch,col:col+cw]
#print(roi.size)
jieguo = Bz(roi)
if jieguo == True:
strings = ' '
else:
strings = '@'
#print('%s,%s标注:%s'%row%col%string)
print(strings,end=' ')
print('')
cv.waitKey(0)
cv.destroyAllWindows()
原图
结果