中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

網(wǎng)站制作公司興田德潤(rùn)怎么聯(lián)系今天熱點(diǎn)新聞

網(wǎng)站制作公司興田德潤(rùn)怎么聯(lián)系,今天熱點(diǎn)新聞,網(wǎng)站產(chǎn)品圖片尺寸,川暢聯(lián)系 做網(wǎng)站多少錢【Python】基于OpenCV人臉追蹤、手勢(shì)識(shí)別控制的求實(shí)之路FPS游戲操作 文章目錄 手勢(shì)識(shí)別人臉追蹤鍵盤控制整體代碼附錄:列表的賦值類型和py打包列表賦值BUG復(fù)現(xiàn)代碼改進(jìn)優(yōu)化總結(jié) py打包 視頻: 基于OpenCV人臉追蹤、手勢(shì)識(shí)別控制的求實(shí)之路FPS游戲操作 手…

【Python】基于OpenCV人臉追蹤、手勢(shì)識(shí)別控制的求實(shí)之路FPS游戲操作

文章目錄

  • 手勢(shì)識(shí)別
  • 人臉追蹤
  • 鍵盤控制
  • 整體代碼
  • 附錄:列表的賦值類型和py打包
    • 列表賦值
      • BUG復(fù)現(xiàn)
      • 代碼改進(jìn)
      • 優(yōu)化
      • 總結(jié)
    • py打包

視頻:

基于OpenCV人臉追蹤、手勢(shì)識(shí)別控制的求實(shí)之路FPS游戲操作

手勢(shì)識(shí)別

采用MediaPipe模塊來(lái)完成手勢(shì)識(shí)別 同時(shí)通過(guò)計(jì)算各個(gè)關(guān)鍵點(diǎn)與手掌平面的角度來(lái)判斷手指是否彎曲、伸展
在這里插入圖片描述
如上圖為各個(gè)關(guān)鍵點(diǎn)的ID序號(hào)

比如蜘蛛俠手勢(shì):

 elif (angle_list[0]<thr_angle_s)  and (angle_list[1]<thr_angle_s) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]<thr_angle_s):gesture_str = "Spider-Man"

就是判斷拇指 食指 小指伸展 其他閉合

在這里插入圖片描述
【優(yōu)秀課設(shè)】基于OpenCV+MediaPipe的手勢(shì)識(shí)別(數(shù)字、石頭剪刀布等手勢(shì)識(shí)別)

def vector_2d_angle(v1,v2):'''求解二維向量的角度'''v1_x=v1[0]v1_y=v1[1]v2_x=v2[0]v2_y=v2[1]try:angle_= math.degrees(math.acos((v1_x*v2_x+v1_y*v2_y)/(((v1_x**2+v1_y**2)**0.5)*((v2_x**2+v2_y**2)**0.5))))except:angle_ =65535.if angle_ > 180.:angle_ = 65535.return angle_def hand_angle(hand_):'''獲取對(duì)應(yīng)手相關(guān)向量的二維角度,根據(jù)角度確定手勢(shì)'''angle_list = []#---------------------------- thumb 大拇指角度angle_ = vector_2d_angle(((int(hand_[0][0])- int(hand_[2][0])),(int(hand_[0][1])-int(hand_[2][1]))),((int(hand_[3][0])- int(hand_[4][0])),(int(hand_[3][1])- int(hand_[4][1]))))angle_list.append(angle_)#---------------------------- index 食指角度angle_ = vector_2d_angle(((int(hand_[0][0])-int(hand_[6][0])),(int(hand_[0][1])- int(hand_[6][1]))),((int(hand_[7][0])- int(hand_[8][0])),(int(hand_[7][1])- int(hand_[8][1]))))angle_list.append(angle_)#---------------------------- middle 中指角度angle_ = vector_2d_angle(((int(hand_[0][0])- int(hand_[10][0])),(int(hand_[0][1])- int(hand_[10][1]))),((int(hand_[11][0])- int(hand_[12][0])),(int(hand_[11][1])- int(hand_[12][1]))))angle_list.append(angle_)#---------------------------- ring 無(wú)名指角度angle_ = vector_2d_angle(((int(hand_[0][0])- int(hand_[14][0])),(int(hand_[0][1])- int(hand_[14][1]))),((int(hand_[15][0])- int(hand_[16][0])),(int(hand_[15][1])- int(hand_[16][1]))))angle_list.append(angle_)#---------------------------- pink 小拇指角度angle_ = vector_2d_angle(((int(hand_[0][0])- int(hand_[18][0])),(int(hand_[0][1])- int(hand_[18][1]))),((int(hand_[19][0])- int(hand_[20][0])),(int(hand_[19][1])- int(hand_[20][1]))))angle_list.append(angle_)return angle_listdef h_gesture(angle_list):'''# 二維約束的方法定義手勢(shì)# fist five gun love one six three thumbup yeah'''thr_angle = 65.  #手指閉合則大于這個(gè)值(大拇指除外)thr_angle_thumb = 53.  #大拇指閉合則大于這個(gè)值thr_angle_s = 49.  #手指張開則小于這個(gè)值gesture_str = "Unknown"if 65535. not in angle_list:if (angle_list[0]>thr_angle_thumb) and (angle_list[1]>thr_angle) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle):gesture_str = "0"elif (angle_list[0]>thr_angle_thumb)  and (angle_list[1]<thr_angle_s) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle):gesture_str = "1"elif (angle_list[0]>thr_angle_thumb)  and (angle_list[1]<thr_angle_s) and (angle_list[2]<thr_angle_s) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle):gesture_str = "2"elif (angle_list[0]>thr_angle_thumb)  and (angle_list[1]<thr_angle_s) and (angle_list[2]<thr_angle_s) and (angle_list[3]<thr_angle_s) and (angle_list[4]>thr_angle):gesture_str = "3"elif (angle_list[0]>thr_angle_thumb) and (angle_list[1]<thr_angle_s) and (angle_list[2]<thr_angle_s) and (angle_list[3]<thr_angle_s) and (angle_list[4]<thr_angle_s):gesture_str = "4"elif (angle_list[0]<thr_angle_s) and (angle_list[1]<thr_angle_s) and (angle_list[2]<thr_angle_s) and (angle_list[3]<thr_angle_s) and (angle_list[4]<thr_angle_s):gesture_str = "5"elif (angle_list[0]<thr_angle_s)  and (angle_list[1]>thr_angle) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]<thr_angle_s):gesture_str = "6"elif (angle_list[0]<thr_angle_s)  and (angle_list[1]<thr_angle_s) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle):gesture_str = "8"elif (angle_list[0]>thr_angle_thumb) and (angle_list[1]>thr_angle) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]<thr_angle_s):gesture_str = "Pink Up"elif (angle_list[0]<thr_angle_s)  and (angle_list[1]>thr_angle) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle):gesture_str = "Thumb Up"elif (angle_list[0]>thr_angle_thumb) and (angle_list[1]>thr_angle) and (angle_list[2]<thr_angle_s) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle):gesture_str = "Fuck"elif (angle_list[0]>thr_angle_thumb) and (angle_list[1]>thr_angle) and (angle_list[2]<thr_angle_s) and (angle_list[3]<thr_angle_s) and (angle_list[4]<thr_angle_s):gesture_str = "Princess"elif (angle_list[0]<thr_angle_s)  and (angle_list[1]<thr_angle_s) and (angle_list[2]<thr_angle_s) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle):gesture_str = "Bye"elif (angle_list[0]<thr_angle_s)  and (angle_list[1]<thr_angle_s) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]<thr_angle_s):gesture_str = "Spider-Man"elif (angle_list[0]>thr_angle_thumb)  and (angle_list[1]<thr_angle_s) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]<thr_angle_s):gesture_str = "Rock'n'Roll"return gesture_strdef hand_detect():global qglobal kill_all_flagglobal cam_imgbye_flag = 0bye_time = time.time()hand_jugg = Nonegesture_str = Nonewhile True:time.sleep(0.1)while q==0:time.sleep(0.1)frame = cv2.cvtColor(cam_img, cv2.COLOR_BGR2RGB)results = hands.process(frame)if results.multi_handedness:                for hand_label in results.multi_handedness:hand_jugg=str(hand_label).split('"')[1]+" Hand"print(hand_jugg)
#                    cv2.putText(faceImg,hand_jugg,(50,200),0,1.3,(0,0,255),2)if results.multi_hand_landmarks:for hand_landmarks in results.multi_hand_landmarks:
#                    mp_drawing.draw_landmarks(faceImg, hand_landmarks, mp_hands.HAND_CONNECTIONS)hand_local = []for i in range(21):x = hand_landmarks.landmark[i].x*frame.shape[1]y = hand_landmarks.landmark[i].y*frame.shape[0]hand_local.append((x,y))if hand_local:angle_list = hand_angle(hand_local)gesture_str = h_gesture(angle_list)print(gesture_str)
#                        cv2.putText(faceImg,gesture_str,(50,100),0,1.3,(0,0,255),2)if gesture_str == "Bye":if bye_flag == 0:bye_flag = 1elif bye_flag == 1 and time.time() - bye_time >= 3:kill_all_flag = 1q = 1print("Good-Bye")else:bye_flag = 1                    else:Keyborad(hand_jugg,gesture_str)bye_flag = 0hand_jugg = Nonegesture_str = Noneif q == 1:breakif kill_all_flag == 1:breakreturn 

人臉追蹤

【優(yōu)秀畢設(shè)V2.0】基于樹莓派的OpenCV-Python攝像頭人臉追蹤及手勢(shì)識(shí)別、網(wǎng)絡(luò)地址推流及遠(yuǎn)程控制系統(tǒng)(多功能系統(tǒng)、含演示視頻)
此部分簡(jiǎn)單易懂
就是靠識(shí)別人臉的位置 然后再判斷位置就可以了

def track():global qglobal kill_all_flagglobal cam_imgglobal left_pointglobal right_pointwhile True:time.sleep(0.1)while q==0:            time.sleep(0.05) gray = cv2.cvtColor(cam_img,cv2.COLOR_BGR2GRAY)faceRects = classifier.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=3,minSize=(32, 32))if len(faceRects):x,y,w,h = faceRects[0]# 框選出人臉   最后一個(gè)參數(shù)2是框線寬度 
#                cv2.rectangle(faceImg,(x, y), (x + w, y + h), (0,255,0), 2)central_point = x+w/2 if central_point > left_point:print("Right")Mouse(1)elif central_point < right_point:print("Left")Mouse(2)else:Mouse(0)if q == 1:print("S")breakif kill_all_flag == 1:breakreturn 

鍵盤控制

采用pyautogui庫(kù)來(lái)進(jìn)行
以下兩個(gè)函數(shù)分別是鼠標(biāo)移動(dòng)和鍵盤操作

def Mouse(flag):print(flag)if flag==1:pyautogui.moveTo(100, 100, duration=0.25)passelif flag==2:pyautogui.moveRel(-50, 0, duration=0.25)pass
def Keyborad(hand_jugg,gesture_str):print(hand_jugg,gesture_str)if hand_jugg=="Right Hand":if gesture_str=="1":pyautogui.click()elif gesture_str=="2":pyautogui.click(button='right')elif gesture_str=="4":pyautogui.mouseDown()elif gesture_str=="5":pyautogui.mouseUp()

整體代碼

整體代碼將三個(gè)部分整合起來(lái) 并且用多線程的方式 將攝像頭獲取、人臉追蹤、手勢(shì)識(shí)別跑起來(lái) 互不影響

# -*- coding: utf-8 -*-
"""
Created on Sun Sep 10 10:54:53 2023@author: ZHOU
"""import cv2
import threading
import mediapipe as mp
import math
import timeimport pyautoguipyautogui.FAILSAFE = True  # 啟用自動(dòng)防故障功能,左上角的坐標(biāo)為(0,0),將鼠標(biāo)移到屏幕的左上角,來(lái)拋出failSafeException異常global q
q = 0
global kill_all_flag
kill_all_flag = 0cap = cv2.VideoCapture(0)  # 開啟攝像頭
classifier = cv2.CascadeClassifier('./haarcascade_frontalface_alt2.xml')global cam_img
ok, cam_img = cap.read()  # 讀取攝像頭圖像
if ok is False:q = 1kill_all_flag = 1print('無(wú)法讀取到攝像頭!')
high=cam_img.shape[0]
width=cam_img.shape[1]
global left_point
global right_point
left_point = width/2+width*0.04
right_point = width/2-width*0.04mp_drawing = mp.solutions.drawing_utils
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(static_image_mode=False,max_num_hands=1,min_detection_confidence=0.6,min_tracking_confidence=0.75)def Mouse(flag):print(flag)if flag==1:
#        pyautogui.moveTo(100, 100, duration=0.25)passelif flag==2:
#        pyautogui.moveRel(-50, 0, duration=0.25)pass
def Keyborad(hand_jugg,gesture_str):print(hand_jugg,gesture_str)if hand_jugg=="Right Hand":if gesture_str=="1":pyautogui.click()elif gesture_str=="2":pyautogui.click(button='right')elif gesture_str=="4":pyautogui.mouseDown()elif gesture_str=="5":pyautogui.mouseUp()def vector_2d_angle(v1,v2):'''求解二維向量的角度'''v1_x=v1[0]v1_y=v1[1]v2_x=v2[0]v2_y=v2[1]try:angle_= math.degrees(math.acos((v1_x*v2_x+v1_y*v2_y)/(((v1_x**2+v1_y**2)**0.5)*((v2_x**2+v2_y**2)**0.5))))except:angle_ =65535.if angle_ > 180.:angle_ = 65535.return angle_def hand_angle(hand_):'''獲取對(duì)應(yīng)手相關(guān)向量的二維角度,根據(jù)角度確定手勢(shì)'''angle_list = []#---------------------------- thumb 大拇指角度angle_ = vector_2d_angle(((int(hand_[0][0])- int(hand_[2][0])),(int(hand_[0][1])-int(hand_[2][1]))),((int(hand_[3][0])- int(hand_[4][0])),(int(hand_[3][1])- int(hand_[4][1]))))angle_list.append(angle_)#---------------------------- index 食指角度angle_ = vector_2d_angle(((int(hand_[0][0])-int(hand_[6][0])),(int(hand_[0][1])- int(hand_[6][1]))),((int(hand_[7][0])- int(hand_[8][0])),(int(hand_[7][1])- int(hand_[8][1]))))angle_list.append(angle_)#---------------------------- middle 中指角度angle_ = vector_2d_angle(((int(hand_[0][0])- int(hand_[10][0])),(int(hand_[0][1])- int(hand_[10][1]))),((int(hand_[11][0])- int(hand_[12][0])),(int(hand_[11][1])- int(hand_[12][1]))))angle_list.append(angle_)#---------------------------- ring 無(wú)名指角度angle_ = vector_2d_angle(((int(hand_[0][0])- int(hand_[14][0])),(int(hand_[0][1])- int(hand_[14][1]))),((int(hand_[15][0])- int(hand_[16][0])),(int(hand_[15][1])- int(hand_[16][1]))))angle_list.append(angle_)#---------------------------- pink 小拇指角度angle_ = vector_2d_angle(((int(hand_[0][0])- int(hand_[18][0])),(int(hand_[0][1])- int(hand_[18][1]))),((int(hand_[19][0])- int(hand_[20][0])),(int(hand_[19][1])- int(hand_[20][1]))))angle_list.append(angle_)return angle_listdef h_gesture(angle_list):'''# 二維約束的方法定義手勢(shì)# fist five gun love one six three thumbup yeah'''thr_angle = 65.  #手指閉合則大于這個(gè)值(大拇指除外)thr_angle_thumb = 53.  #大拇指閉合則大于這個(gè)值thr_angle_s = 49.  #手指張開則小于這個(gè)值gesture_str = "Unknown"if 65535. not in angle_list:if (angle_list[0]>thr_angle_thumb) and (angle_list[1]>thr_angle) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle):gesture_str = "0"elif (angle_list[0]>thr_angle_thumb)  and (angle_list[1]<thr_angle_s) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle):gesture_str = "1"elif (angle_list[0]>thr_angle_thumb)  and (angle_list[1]<thr_angle_s) and (angle_list[2]<thr_angle_s) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle):gesture_str = "2"elif (angle_list[0]>thr_angle_thumb)  and (angle_list[1]<thr_angle_s) and (angle_list[2]<thr_angle_s) and (angle_list[3]<thr_angle_s) and (angle_list[4]>thr_angle):gesture_str = "3"elif (angle_list[0]>thr_angle_thumb) and (angle_list[1]<thr_angle_s) and (angle_list[2]<thr_angle_s) and (angle_list[3]<thr_angle_s) and (angle_list[4]<thr_angle_s):gesture_str = "4"elif (angle_list[0]<thr_angle_s) and (angle_list[1]<thr_angle_s) and (angle_list[2]<thr_angle_s) and (angle_list[3]<thr_angle_s) and (angle_list[4]<thr_angle_s):gesture_str = "5"elif (angle_list[0]<thr_angle_s)  and (angle_list[1]>thr_angle) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]<thr_angle_s):gesture_str = "6"elif (angle_list[0]<thr_angle_s)  and (angle_list[1]<thr_angle_s) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle):gesture_str = "8"elif (angle_list[0]>thr_angle_thumb) and (angle_list[1]>thr_angle) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]<thr_angle_s):gesture_str = "Pink Up"elif (angle_list[0]<thr_angle_s)  and (angle_list[1]>thr_angle) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle):gesture_str = "Thumb Up"elif (angle_list[0]>thr_angle_thumb) and (angle_list[1]>thr_angle) and (angle_list[2]<thr_angle_s) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle):gesture_str = "Fuck"elif (angle_list[0]>thr_angle_thumb) and (angle_list[1]>thr_angle) and (angle_list[2]<thr_angle_s) and (angle_list[3]<thr_angle_s) and (angle_list[4]<thr_angle_s):gesture_str = "Princess"elif (angle_list[0]<thr_angle_s)  and (angle_list[1]<thr_angle_s) and (angle_list[2]<thr_angle_s) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle):gesture_str = "Bye"elif (angle_list[0]<thr_angle_s)  and (angle_list[1]<thr_angle_s) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]<thr_angle_s):gesture_str = "Spider-Man"elif (angle_list[0]>thr_angle_thumb)  and (angle_list[1]<thr_angle_s) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]<thr_angle_s):gesture_str = "Rock'n'Roll"return gesture_strdef hand_detect():global qglobal kill_all_flagglobal cam_imgbye_flag = 0bye_time = time.time()hand_jugg = Nonegesture_str = Nonewhile True:time.sleep(0.1)while q==0:time.sleep(0.1)frame = cv2.cvtColor(cam_img, cv2.COLOR_BGR2RGB)results = hands.process(frame)if results.multi_handedness:                for hand_label in results.multi_handedness:hand_jugg=str(hand_label).split('"')[1]+" Hand"print(hand_jugg)
#                    cv2.putText(faceImg,hand_jugg,(50,200),0,1.3,(0,0,255),2)if results.multi_hand_landmarks:for hand_landmarks in results.multi_hand_landmarks:
#                    mp_drawing.draw_landmarks(faceImg, hand_landmarks, mp_hands.HAND_CONNECTIONS)hand_local = []for i in range(21):x = hand_landmarks.landmark[i].x*frame.shape[1]y = hand_landmarks.landmark[i].y*frame.shape[0]hand_local.append((x,y))if hand_local:angle_list = hand_angle(hand_local)gesture_str = h_gesture(angle_list)print(gesture_str)
#                        cv2.putText(faceImg,gesture_str,(50,100),0,1.3,(0,0,255),2)if gesture_str == "Bye":if bye_flag == 0:bye_flag = 1elif bye_flag == 1 and time.time() - bye_time >= 3:kill_all_flag = 1q = 1print("Good-Bye")else:bye_flag = 1                    else:Keyborad(hand_jugg,gesture_str)bye_flag = 0hand_jugg = Nonegesture_str = Noneif q == 1:breakif kill_all_flag == 1:breakreturn def track():global qglobal kill_all_flagglobal cam_imgglobal left_pointglobal right_pointwhile True:time.sleep(0.1)while q==0:            time.sleep(0.05) gray = cv2.cvtColor(cam_img,cv2.COLOR_BGR2GRAY)faceRects = classifier.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=3,minSize=(32, 32))if len(faceRects):x,y,w,h = faceRects[0]# 框選出人臉   最后一個(gè)參數(shù)2是框線寬度 
#                cv2.rectangle(faceImg,(x, y), (x + w, y + h), (0,255,0), 2)central_point = x+w/2 if central_point > left_point:print("Right")Mouse(1)elif central_point < right_point:print("Left")Mouse(2)else:Mouse(0)if q == 1:print("S")breakif kill_all_flag == 1:breakreturn def img_main():global qglobal kill_all_flagglobal cam_img thread_track = threading.Thread(target=track)thread_track.setDaemon(True)thread_track.start()thread_hand = threading.Thread(target=hand_detect)thread_hand.setDaemon(True)thread_hand.start()   while True:time.sleep(0.1)while q==0:cam_img = cv2.flip(cap.read()[1],1)cv2.imshow("video_feed",cam_img)# 展示圖像            if q == 1:   # 通過(guò)esc鍵退出攝像q = 1print("暫停程序")cv2.destroyAllWindows()breakif cv2.waitKey(10) == 27:kill_all_flag = 1q = 1print("結(jié)束程序")cv2.destroyAllWindows()breakif kill_all_flag == 1:breakcap.release()print("全部退出")return def main():img_main()    time.sleep(1)print("已退出所有程序")return if __name__ == "__main__":    main()

附錄:列表的賦值類型和py打包

列表賦值

BUG復(fù)現(xiàn)

閑來(lái)無(wú)事寫了個(gè)小程序 代碼如下:

# -*- coding: utf-8 -*-
"""
Created on Fri Nov 19 19:47:01 2021@author: 16016
"""a_list = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15']
#print(len(a_list))
#b_list = ['','','','','','','','','','','','','','','','']
c_list = [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]
#for i in range(16):
if len(a_list):for j in range(16):a_list[j]=str(a_list[j])+'_'+str(j)print("序號(hào):",j)print('a_list:\n',a_list)c_list[j]=a_listprint('c_list[0]:\n',c_list[0])print('\n')
#        b_list[j]=a_list[7],a_list[8]
#        print(b_list[j])# 寫入到Excel:
#print(c_list,'\n')    

我在程序中 做了一個(gè)16次的for循環(huán) 把列表a的每個(gè)值后面依次加上"_"和循環(huán)序號(hào)
比如循環(huán)第x次 就是把第x位加上_x 這一位變成x_x 我在輸出測(cè)試中 列表a的每一次輸出也是對(duì)的
循環(huán)16次后列表a應(yīng)該變成[‘0_0’, ‘1_1’, ‘2_2’, ‘3_3’, ‘4_4’, ‘5_5’, ‘6_6’, ‘7_7’, ‘8_8’, ‘9_9’, ‘10_10’, ‘11_11’, ‘12_12’, ‘13_13’, ‘14_14’, ‘15_15’] 這也是對(duì)的

同時(shí) 我將每一次循環(huán)時(shí)列表a的值 寫入到空列表c中 比如第x次循環(huán) 就是把更改以后的列表a的值 寫入到列表c的第x位
第0次循環(huán)后 c[0]的值應(yīng)該是[‘0_0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘10’, ‘11’, ‘12’, ‘13’, ‘14’, ‘15’] 這也是對(duì)的
但是在第1次循環(huán)以后 c[0]的值就一直在變 變成了c[x]的值
相當(dāng)于把c_list[0]變成了c_list[1]…以此類推 最后得出的列表c的值也是每一項(xiàng)完全一樣
我不明白這是怎么回事
我的c[0]只在第0次循環(huán)時(shí)被賦值了 但是后面它的值跟著在改變

如圖:
在這里插入圖片描述
第一次老出bug 賦值以后 每次循環(huán)都改變c[0]的值 搞了半天都沒(méi)搞出來(lái)
無(wú)論是用appen函數(shù)添加 還是用二維數(shù)組定義 或者增加第三個(gè)空數(shù)組來(lái)過(guò)渡 都無(wú)法解決

代碼改進(jìn)

后來(lái)在我華科同學(xué)的指導(dǎo)下 突然想到賦值可以賦的是個(gè)地址 地址里面的值一直變化 導(dǎo)致賦值也一直變化 于是用第二張圖的循環(huán)套循環(huán)深度復(fù)制實(shí)現(xiàn)了

代碼如下:

# -*- coding: utf-8 -*-
"""
Created on Fri Nov 19 19:47:01 2021@author: 16016
"""a_list = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15']
#print(len(a_list))
#b_list = ['','','','','','','','','','','','','','','','']
c_list = [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]
#for i in range(16):
if len(a_list):for j in range(16):a_list[j]=str(a_list[j])+'_'+str(j)print("序號(hào):",j)print('a_list:\n',a_list)for i in range(16):c_list[j].append(a_list[i])print('c_list[0]:\n',c_list[0])print('\n')
#        b_list[j]=a_list[7],a_list[8]
#        print(b_list[j])# 寫入到Excel:
print(c_list,'\n')    

解決了問(wèn)題

在這里插入圖片描述

優(yōu)化

第三次是請(qǐng)教了老師 用copy函數(shù)來(lái)賦真值

代碼如下:

# -*- coding: utf-8 -*-
"""
Created on Fri Nov 19 19:47:01 2021@author: 16016
"""a_list = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15']
#print(len(a_list))
#b_list = ['','','','','','','','','','','','','','','','']
c_list = [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]
#for i in range(16):
if len(a_list):for j in range(16):a_list[j]=str(a_list[j])+'_'+str(j)print("序號(hào):",j)print('a_list:\n',a_list)c_list[j]=a_list.copy()print('c_list[0]:\n',c_list[0])print('\n')
#        b_list[j]=a_list[7],a_list[8]
#        print(b_list[j])# 寫入到Excel:
#print(c_list,'\n')    

同樣能解決問(wèn)題
在這里插入圖片描述
最后得出問(wèn)題 就是指針惹的禍!

a_list指向的是個(gè)地址 而不是值 a_list[i]指向的才是單個(gè)的值 copy()函數(shù)也是復(fù)制值而不是地址

如果這個(gè)用C語(yǔ)言來(lái)寫 就直觀一些了 難怪C語(yǔ)言是基礎(chǔ) 光學(xué)Python不學(xué)C 遇到這樣的問(wèn)題就解決不了

C語(yǔ)言yyds Python是什么垃圾弱智語(yǔ)言

總結(jié)

由于Python無(wú)法單獨(dú)定義一個(gè)值為指針或者獨(dú)立的值 所以只能用列表來(lái)傳送
只要賦值是指向一個(gè)列表整體的 那么就是指向的一個(gè)指針內(nèi)存地址 解決方法只有一個(gè) 那就是將每個(gè)值深度復(fù)制賦值(子列表內(nèi)的元素提取出來(lái)重新依次連接) 或者用copy函數(shù)單獨(dú)賦值

如圖測(cè)試:
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
部分代碼:

# -*- coding: utf-8 -*-
"""
Created on Sat Nov 20 16:45:48 2021@author: 16016
"""def text1():A=[1,2,3]B=[[],[],[]]for i in range(len(A)):A[i]=A[i]+iB[i]=Aprint(B)def text2():A=[1,2,3]B=[[],[],[]]A[0]=A[0]+0B[0]=Aprint(B)A[1]=A[1]+1B[1]=Aprint(B)A[2]=A[2]+2B[2]=Aprint(B)if __name__ == '__main__':text1()print('\n')text2()

py打包

Pyinstaller打包exe(包括打包資源文件 絕不出錯(cuò)版)

依賴包及其對(duì)應(yīng)的版本號(hào)

PyQt5 5.10.1
PyQt5-Qt5 5.15.2
PyQt5-sip 12.9.0

pyinstaller 4.5.1
pyinstaller-hooks-contrib 2021.3

Pyinstaller -F setup.py 打包exe

Pyinstaller -F -w setup.py 不帶控制臺(tái)的打包

Pyinstaller -F -i xx.ico setup.py 打包指定exe圖標(biāo)打包

打包exe參數(shù)說(shuō)明:

-F:打包后只生成單個(gè)exe格式文件;

-D:默認(rèn)選項(xiàng),創(chuàng)建一個(gè)目錄,包含exe文件以及大量依賴文件;

-c:默認(rèn)選項(xiàng),使用控制臺(tái)(就是類似cmd的黑框);

-w:不使用控制臺(tái);

-p:添加搜索路徑,讓其找到對(duì)應(yīng)的庫(kù);

-i:改變生成程序的icon圖標(biāo)。

如果要打包資源文件
則需要對(duì)代碼中的路徑進(jìn)行轉(zhuǎn)換處理
另外要注意的是 如果要打包資源文件 則py程序里面的路徑要從./xxx/yy換成xxx/yy 并且進(jìn)行路徑轉(zhuǎn)換
但如果不打包資源文件的話 最好路徑還是用作./xxx/yy 并且不進(jìn)行路徑轉(zhuǎn)換

def get_resource_path(relative_path):if hasattr(sys, '_MEIPASS'):return os.path.join(sys._MEIPASS, relative_path)return os.path.join(os.path.abspath("."), relative_path)

而后再spec文件中的datas部分加入目錄
如:

a = Analysis(['cxk.py'],pathex=['D:\\Python Test\\cxk'],binaries=[],datas=[('root','root')],hiddenimports=[],hookspath=[],hooksconfig={},runtime_hooks=[],excludes=[],win_no_prefer_redirects=False,win_private_assemblies=False,cipher=block_cipher,noarchive=False)

而后直接Pyinstaller -F setup.spec即可

如果打包的文件過(guò)大則更改spec文件中的excludes 把不需要的庫(kù)寫進(jìn)去(但是已經(jīng)在環(huán)境中安裝了的)就行

這些不要了的庫(kù)在上一次編譯時(shí)的shell里面輸出
比如:
在這里插入圖片描述

在這里插入圖片描述
然后用pyinstaller --clean -F 某某.spec

http://www.risenshineclean.com/news/45783.html

相關(guān)文章:

  • 佛山網(wǎng)站代運(yùn)營(yíng)準(zhǔn)度科技有限公司網(wǎng)站內(nèi)部鏈接優(yōu)化方法
  • 紹興做網(wǎng)站優(yōu)化大師電腦版
  • 免費(fèi)商品列表網(wǎng)頁(yè)模板源代碼seo快速排名上首頁(yè)
  • 定制制作網(wǎng)站哪家好惠州seo網(wǎng)站推廣
  • 服裝官網(wǎng)網(wǎng)站建設(shè)百度推廣登陸后臺(tái)
  • 幫你省網(wǎng)站怎么做怎樣做網(wǎng)絡(luò)銷售平臺(tái)
  • 靜態(tài)網(wǎng)頁(yè)和動(dòng)態(tài)網(wǎng)頁(yè)的區(qū)別是什么魔貝課凡seo課程好嗎
  • 網(wǎng)站服務(wù)器打不開大數(shù)據(jù)培訓(xùn)班需要多少錢
  • 邢臺(tái)市做網(wǎng)站seo工具不包括
  • 昔陽(yáng)網(wǎng)站建設(shè)注冊(cè)域名在哪里注冊(cè)
  • php做門戶網(wǎng)站2024年最新時(shí)事新聞
  • 電影頻道做的網(wǎng)站廣告谷歌手機(jī)版瀏覽器官網(wǎng)
  • 小企業(yè)網(wǎng)絡(luò)營(yíng)銷外包南寧seo產(chǎn)品優(yōu)化服務(wù)
  • wordpress建站好嗎武漢seo搜索優(yōu)化
  • 網(wǎng)絡(luò)營(yíng)銷常用的方法seo 優(yōu)化技術(shù)難度大嗎
  • 專業(yè)做網(wǎng)站公司排名人工智能培訓(xùn)機(jī)構(gòu)哪個(gè)好
  • 做壁畫的網(wǎng)站湖南網(wǎng)站優(yōu)化
  • 如何在搜索中找到自己做的網(wǎng)站設(shè)計(jì)模板網(wǎng)站
  • msn網(wǎng)站制作windows優(yōu)化大師怎么用
  • 做商業(yè)廣告有什么網(wǎng)站好推銷的北大青鳥職業(yè)技術(shù)學(xué)院簡(jiǎn)介
  • 女人能做網(wǎng)站開發(fā)嗎世界杯比分
  • 做網(wǎng)站可以申請(qǐng)專利嗎優(yōu)化防疫措施
  • 非響應(yīng)式網(wǎng)站改響應(yīng)式百度推廣賬號(hào)
  • 淘寶了做網(wǎng)站賣什么好百度怎么優(yōu)化網(wǎng)站關(guān)鍵詞
  • 網(wǎng)站開發(fā)實(shí)施計(jì)劃與安排網(wǎng)絡(luò)推廣培訓(xùn)
  • 定制網(wǎng)站前準(zhǔn)備手機(jī)版怎么用百度快照
  • 廣東企業(yè)網(wǎng)站模板推薦長(zhǎng)春網(wǎng)站優(yōu)化團(tuán)隊(duì)
  • 保定專業(yè)做網(wǎng)站seo網(wǎng)絡(luò)貿(mào)易網(wǎng)站推廣
  • 包頭教育平臺(tái)網(wǎng)站建設(shè)seo網(wǎng)站推廣免費(fèi)
  • 網(wǎng)站建設(shè)工具有哪些寧波seo整體優(yōu)化公司