python --face_recognition(人臉識別,檢測,特征提取,繪制鼻子,眼睛,嘴巴,眉毛)/活體檢測

dlib 安裝方法 之前博文 https://blog.csdn.net/weixin_44634704/article/details/141332644

環境:

python==3.8
opencv-python==4.11.0.86
face_recognition==1.3.0
dlib==19.24.6

人臉檢測

import cv2
import face_recognition# 讀取人臉圖片
img = cv2.imread(r"C:\Users\123\Desktop\1.jpg")
face_List = face_recognition.face_locations(img) # 檢測人臉,返回人臉坐標信息
print(face_List)for x in face_List: # 畫框cv2.rectangle(img, (x[3], x[0]), (x[1], x[2]), (0, 255, 0), 2)
cv2.imshow("a", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 輸出: [(116, 306, 223, 199)]

在這里插入圖片描述

人臉分割(切割)

import cv2
import face_recognition# 讀取人臉圖片
img = cv2.imread(r"C:\Users\123\Desktop\1.jpg")
face_List = face_recognition.face_locations(img) # 檢測人臉,返回人臉坐標信息
print(face_List)for x in face_List: # 畫框cv2.rectangle(img, (x[3], x[0]), (x[1], x[2]), (0, 255, 0), 2)qie_img = img[x[0]:x[2], x[3]:x[1]]cv2.imshow("a", qie_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在這里插入圖片描述

提取人臉特征向量

img = cv2.imread(r"C:\Users\123\Desktop\1.jpg")
# 提取人臉特征向量
face01 = face_recognition.face_encodings(img)[0]
print(face01)

人臉比對(歐式距離)

import cv2
import face_recognition
import numpy as np# 讀取人臉圖片
img = cv2.imread(r"C:\Users\123\Desktop\1.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # face_recognition庫,處理是RGB格式, CV默認為BGR
# 提取人臉特征向量
face01 = face_recognition.face_encodings(img)[0]
# 讀取人臉原圖的圖片
img2 = cv2.imread(r"C:\Users\123\Desktop\1.jpg")
face02 = face_recognition.face_encodings(img2)[0]
#
# 計算歐幾里得距離
v = np.linalg.norm(face01 - face02)
if v < 0.8:print("是一個人")
else:print("不是一個人")

轉為置信度

import cv2
import face_recognition
import numpy as npdef euclidean_distance_to_confidence(distance, max_distance):# 確保距離在合理范圍內distance = min(distance, max_distance)# 計算置信度confidence = 1 - (distance / max_distance)return confidence# 讀取人臉圖片
img = cv2.imread(r"C:\Users\123\Desktop\1.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # face_recognition庫,處理是RGB格式, CV默認為BGR
# 提取人臉特征向量
face01 = face_recognition.face_encodings(img)[0]
# 讀取人臉原圖的圖片
img2 = cv2.imread(r"C:\Users\123\Desktop\1.jpg")
face02 = face_recognition.face_encodings(img2)[0]
#
# 計算歐幾里得距離
v = np.linalg.norm(face01 - face02)
w = euclidean_distance_to_confidence(v, 1) # 置信度最大閾值為1
print(w) # 計算置信度,距離越小,置信度越高。

人臉比對(余弦)

import cv2
import face_recognition
import numpy as npdef cosine_similarity_to_confidence(similarity):# 將余弦相似度從 [-1, 1] 映射到 [0, 1]confidence = (similarity + 1) / 2return confidence# 讀取人臉圖片
img = cv2.imread(r"C:\Users\123\Desktop\1.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # face_recognition庫,處理是RGB格式, CV默認為BGR
# 提取人臉特征向量
face01 = face_recognition.face_encodings(img)[0]
# 讀取人臉原圖的圖片
img2 = cv2.imread(r"C:\Users\123\Desktop\1.jpg")
face02 = face_recognition.face_encodings(img2)[0]
#
dot_product = np.dot(face01, face02)
norm_face01 = np.linalg.norm(face01)
norm_face02 = np.linalg.norm(face02)
similarity = dot_product / (norm_face01 * norm_face02)
print("余弦相似度:", similarity)
confidence = cosine_similarity_to_confidence(similarity)
print("置信度:", confidence)

繪制眼睛,嘴巴,鼻子,輪廓線條

import cv2
import face_recognition
import numpy as np# 讀取人臉圖片
img = cv2.imread(r"C:\Users\123\Desktop\1.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # face_recognition庫,處理是RGB格式, CV默認為BGR#img = face_recognition.load_image_file("face.jpg")
face_landmarks = face_recognition.face_landmarks(img)# 把特征點都畫出來
for landmarks in face_landmarks:print(landmarks)# 畫眼睛for eye in ('left_eye', 'right_eye'):pts = np.array(landmarks[eye], np.int32)cv2.polylines(img, (pts,), True, (0, 255, 0), 2)# 畫嘴巴mouth_pts = np.array(landmarks['top_lip'], np.int32)cv2.polylines(img, (mouth_pts,), True, (0, 0, 255), 2)# 畫鼻子nose_pts = np.array(landmarks['nose_bridge'], np.int32)cv2.polylines(img, (nose_pts,), True, (255, 0, 0), 2)# 繪制臉部輪廓chin_pts = np.array(landmarks['chin'], np.int32)cv2.polylines(img, [chin_pts], False, (255, 255, 0), 2)cv2.imwrite("landmarks.jpg", img[:, :, ::-1])

在這里插入圖片描述

face_recognition 庫檢測出的人臉特征點中,默認是不包含耳朵特征點的。這是因為在很多常見的人臉識別應用場景里,耳朵的特征穩定性和獨特性相對較弱,所以庫沒有專門對耳朵的特征點進行檢測。
不過,要是你想要標記耳朵位置,可以考慮使用更高級的人臉關鍵點檢測模型,像 dlib 庫提供的 68 點或者 81 點人臉關鍵點檢測器,其中 81 點模型包含了耳朵相關的關鍵點。

import cv2
import dlib
import numpy as np# 加載 dlib 的人臉檢測器和 81 點關鍵點預測器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_81_face_landmarks.dat")# 讀取圖片
image = cv2.imread(r"C:\Users\123\Desktop\1.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 檢測人臉
faces = detector(gray)for face in faces:# 檢測關鍵點landmarks = predictor(gray, face)# 繪制眼睛left_eye_points = [(landmarks.part(n).x, landmarks.part(n).y) for n in range(36, 42)]right_eye_points = [(landmarks.part(n).x, landmarks.part(n).y) for n in range(42, 48)]for eye_points in [left_eye_points, right_eye_points]:pts = np.array(eye_points, np.int32)cv2.polylines(image, [pts], True, (0, 255, 0), 2)# 繪制嘴巴mouth_points = [(landmarks.part(n).x, landmarks.part(n).y) for n in range(48, 60)]pts = np.array(mouth_points, np.int32)cv2.polylines(image, [pts], True, (0, 0, 255), 2)# 繪制鼻子nose_points = [(landmarks.part(n).x, landmarks.part(n).y) for n in range(27, 36)]pts = np.array(nose_points, np.int32)cv2.polylines(image, [pts], True, (255, 0, 0), 2)# 繪制臉部輪廓chin_points = [(landmarks.part(n).x, landmarks.part(n).y) for n in range(0, 17)]pts = np.array(chin_points, np.int32)cv2.polylines(image, [pts], False, (255, 255, 0), 2)# 繪制耳朵left_ear_points = [(landmarks.part(n).x, landmarks.part(n).y) for n in range(71, 75)]right_ear_points = [(landmarks.part(n).x, landmarks.part(n).y) for n in range(75, 79)]for ear_points in [left_ear_points, right_ear_points]:pts = np.array(ear_points, np.int32)cv2.polylines(image, [pts], False, (0, 255, 255), 2)# 保存圖片
cv2.imwrite("landmarks.jpg", image)

實時取攝像頭繪制

import numpy as np
import cv2
import face_recognition# 打開攝像頭
video_capture = cv2.VideoCapture(0)while True:# 讀取一幀視頻ret, frame = video_capture.read()# 將圖像從BGR顏色空間轉換為RGB顏色空間,因為face_recognition庫使用RGB格式rgb_frame = frame[:, :, ::-1]# 檢測人臉特征點face_landmarks_list = face_recognition.face_landmarks(rgb_frame)# for face_landmarks in face_landmarks_list:#     # 打印所有特征點類型及其對應的關鍵點坐標#     for facial_feature in face_landmarks.keys():#         print(f"{facial_feature}: {face_landmarks[facial_feature]}")for face_landmarks in face_landmarks_list:# 繪制臉部輪廓chin_points = face_landmarks['chin']pts = [tuple(point) for point in chin_points]pts = np.array(pts, np.int32)cv2.polylines(frame, [pts], False, (255, 255, 0), 2)# 繪制眼睛for eye in ('left_eye', 'right_eye'):eye_points = face_landmarks[eye]pts = [tuple(point) for point in eye_points]pts = np.array(pts, np.int32)cv2.polylines(frame, [pts], True, (0, 255, 0), 2)# 繪制左右眉毛for eyebrow in ('left_eyebrow', 'right_eyebrow'):eyebrow_points = face_landmarks[eyebrow]eyebrow_pts = np.array(eyebrow_points, np.int32)cv2.polylines(frame, [eyebrow_pts], False, (255, 0, 255), 2)# 上嘴唇mouth_pts = np.array(face_landmarks['top_lip'], np.int32)cv2.polylines(frame, (mouth_pts,), True, (0, 0, 255), 2)# 下嘴唇bottom_lip_points = face_landmarks['bottom_lip']bottom_lip_pts = np.array(bottom_lip_points, np.int32)cv2.polylines(frame, [bottom_lip_pts], True, (0, 0, 255), 2)# 繪制鼻子代表鼻梁部分的關鍵點nose_bridge_points = face_landmarks['nose_bridge']pts = [tuple(point) for point in nose_bridge_points]pts = np.array(pts, np.int32)cv2.polylines(frame, [pts], True, (255, 0, 0), 2)# 繪制鼻尖nose_tip_points = face_landmarks['nose_tip']nose_tip_pts = np.array(nose_tip_points, np.int32)cv2.polylines(frame, [nose_tip_pts], True, (0, 255, 255), 2)# 顯示結果圖像cv2.imshow('Video', frame)# 按 'q' 鍵退出循環if cv2.waitKey(1) & 0xFF == ord('q'):break# 釋放攝像頭并關閉所有窗口
video_capture.release()
cv2.destroyAllWindows()

活體檢測

import cv2
import face_recognition
import numpy as np# 計算眼睛的縱橫比
def eye_aspect_ratio(eye):A = np.linalg.norm(np.array(eye[1]) - np.array(eye[5]))B = np.linalg.norm(np.array(eye[2]) - np.array(eye[4]))C = np.linalg.norm(np.array(eye[0]) - np.array(eye[3]))ear = (A + B) / (2.0 * C)return ear# 計算嘴巴的縱橫比
def mouth_aspect_ratio(mouth):# 重新選擇特征點top_mid = (np.array(mouth[2]) + np.array(mouth[3])) // 2bottom_mid = (np.array(mouth[10]) + np.array(mouth[11])) // 2left = np.array(mouth[0])right = np.array(mouth[6])A = np.linalg.norm(top_mid - bottom_mid)C = np.linalg.norm(left - right)mar = A / Creturn mar# 初始化變量
EYE_AR_THRESH = 0.2  # 眼睛縱橫比閾值
EYE_AR_CONSEC_FRAMES = 3  # 連續閉眼幀數閾值
COUNTER_EYE = 0  # 連續閉眼幀數計數器
TOTAL_EYE = 0  # 眨眼次數計數器MOUTH_AR_CONSEC_FRAMES = 3  # 連續張嘴幀數閾值
COUNTER_MOUTH = 0  # 連續張嘴幀數計數器
TOTAL_MOUTH = 0  # 張嘴次數計數器PREVIOUS_LANDMARKS = None  # 上一幀的人臉特征點
HEAD_MOTION_THRESH = 10  # 頭部運動閾值
HEAD_MOTION = False  # 頭部是否移動標志# 動態閾值相關變量
INITIAL_FRAMES = 10  # 用于確定初始閾值的幀數
initial_mar_values = []
MOUTH_AR_THRESH = None# 打開攝像頭
video_capture = cv2.VideoCapture(0)frame_count = 0
while True:# 讀取一幀視頻ret, frame = video_capture.read()# 將圖像從 BGR 顏色空間轉換為 RGB 顏色空間rgb_frame = frame[:, :, ::-1]# 檢測人臉特征點face_landmarks_list = face_recognition.face_landmarks(rgb_frame)for face_landmarks in face_landmarks_list:# 提取左右眼睛的特征點left_eye = face_landmarks['left_eye']right_eye = face_landmarks['right_eye']# 計算左右眼睛的縱橫比left_ear = eye_aspect_ratio(left_eye)right_ear = eye_aspect_ratio(right_eye)# 計算平均縱橫比ear = (left_ear + right_ear) / 2.0# 檢測眨眼if ear < EYE_AR_THRESH:COUNTER_EYE += 1else:if COUNTER_EYE >= EYE_AR_CONSEC_FRAMES:TOTAL_EYE += 1COUNTER_EYE = 0# 提取嘴巴的特征點mouth = face_landmarks['top_lip'] + face_landmarks['bottom_lip']# 計算嘴巴的縱橫比mar = mouth_aspect_ratio(mouth)print(f"嘴巴縱橫比: {mar}")  # 打印嘴巴縱橫比,用于調試# 動態確定嘴巴縱橫比閾值if frame_count < INITIAL_FRAMES:initial_mar_values.append(mar)if frame_count == INITIAL_FRAMES - 1:MOUTH_AR_THRESH = np.mean(initial_mar_values) * 1.2  # 閾值設為初始平均值的 1.2 倍else:# 檢測張嘴if mar > MOUTH_AR_THRESH:COUNTER_MOUTH += 1else:if COUNTER_MOUTH >= MOUTH_AR_CONSEC_FRAMES:TOTAL_MOUTH += 1COUNTER_MOUTH = 0# 檢測頭部運動if PREVIOUS_LANDMARKS is not None:current_landmarks = []for feature in face_landmarks.values():current_landmarks.extend(feature)current_landmarks = np.array(current_landmarks)previous_landmarks = []for feature in PREVIOUS_LANDMARKS.values():previous_landmarks.extend(feature)previous_landmarks = np.array(previous_landmarks)displacement = np.linalg.norm(current_landmarks - previous_landmarks)if displacement > HEAD_MOTION_THRESH:HEAD_MOTION = Trueelse:HEAD_MOTION = FalsePREVIOUS_LANDMARKS = face_landmarks# 在圖像上顯示眨眼次數、張嘴次數和頭部是否移動cv2.putText(frame, f"Blinks: {TOTAL_EYE}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)cv2.putText(frame, f"Opens: {TOTAL_MOUTH}", (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)cv2.putText(frame, f"Head Motion: {'Yes' if HEAD_MOTION else 'No'}", (10, 90), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)# 顯示結果圖像cv2.imshow('Video', frame)frame_count += 1# 按 'q' 鍵退出循環if cv2.waitKey(1) & 0xFF == ord('q'):break# 釋放攝像頭并關閉所有窗口
video_capture.release()
cv2.destroyAllWindows()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/73426.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73426.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73426.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【bug】[42000][1067] Invalid default value for ‘xxx_time‘

MySQL錯誤解決&#xff1a;Invalid default value for xxx_time’問題分析與修復方案 問題描述 在MySQL數據庫操作中&#xff0c;當嘗試創建或修改表結構時&#xff0c;可能會遇到以下錯誤信息&#xff1a; [bug] [42000][1067] Invalid default value for xxx_time這個錯誤…

Go環境相關理解

Linux上安裝的環境變量 ## set go env export GOPATH$HOME/go_workspace export GOPATH/usr/local/go export PATH$PATH:$GOPATH/bin go.mod 和go.sum的理解 go.mod文件 ?go.mod文件定義了模塊的路徑和依賴版本?。它遵循 語義化版本2.0.0規范&#xff0c;記錄了當前項目所依…

Next.js 深度解析:全棧React框架的架構哲學與實踐精髓

Next.js 作為 React 生態中最流行的全棧框架&#xff0c;已經超越了簡單的SSR工具&#xff0c;發展成為完整的Web開發解決方案。以下從八個維度進行深度剖析&#xff1a; 一、核心架構設計 雙引擎驅動模型 頁面路由系統&#xff1a;基于文件系統的約定式路由渲染引擎&#xff…

禾賽盈利了,但激光雷達沒有勝利

還遠沒有到激光雷達黨歡呼的時候。 3月&#xff0c;隨著禾賽科技公布2024年報&#xff0c;全世界第一家也是唯一一家實現全年盈利的激光雷達上市公司誕生&#xff0c;為了這個盈利目標&#xff0c;禾賽科技奮斗了十年。 但極大的出貨量和不高的盈利水平&#xff0c;讓禾賽科技…

心房顫動新機制:ATM/p53通路早期抑制

急性心肌梗死&#xff08;AMI&#xff09;是心血管疾病中的“大魔頭”&#xff0c;它悄無聲息地侵蝕著心臟的肌肉&#xff0c;導致心臟功能受損&#xff0c;嚴重時甚至危及生命。而心房顫動&#xff08;AF&#xff09;&#xff0c;這一常見的心律失常&#xff0c;往往在AMI后悄…

Linux 安裝 Redis

虛擬機安裝 linux https://www.bilibili.com/video/BVldD42177qg?p16 1、安裝 gcc,編譯環境 yum y install gcc-g 2、將 redis-7.2.4.tar.gz放到 linux。如&#xff0c;放到 opt 里 3、進入/opt 目錄下&#xff0c;解壓 tar -zxvf redis-7.2.4.tar.gz 4、進入 redis-7.2.4.tar…

六級備考 詞匯量積累(day11)

sculpture 雕像 allege 指責&#xff0c;聲稱 pledge 發誓 breach 違背&#xff0c;違反 defaulty 違約&#xff0c;違反 infringe 侵犯 infringing on small farmers interest blacmail 勒索 idle 無所事事的 deceive 欺騙 perceive 察覺 conceive 設想 conception 設想 verdi…

關于金碟K3,禁用和啟用需要流程審批后執行

真是難受,是設計師蠢呢自己問題比較多呢,現在都還沒有弄好 點擊禁用和啟用,通過流程來執行 到底是蠢呢還是設計問題,搞了半日沒有效果,搞那么復雜! 而且有樣板都沒有草鞋成功 BOS設計,表單屬性,操作列表: 1、啟用禁用流程

導入 Excel 規則批量修改或刪除 PDF 文檔內容

需要對 PDF 文檔內容進行修改的時候&#xff0c;通常我們會需要借助一些專業的工具來幫我們完成。那我們如果需要修改的 PDF 文檔較多的時候&#xff0c;有什么方法可以幫我們實現批量操作呢&#xff1f;今天這篇文章就給大家介紹一下當我們需要批量修改多個 PDF 文檔的時候&am…

msyql--基本操作之運維篇

檢查 root 用戶的權限 查看該用戶針對這個數據庫的權限 -- 如果在終端連接mysql時需要 mysql -u root -p -- 查看用戶權限 SELECT user, host FROM mysql.user WHERE user root;可以看的出來root有他的訪問權限&#xff0c;如過沒有localhost或者% 說明沒有訪問權限 添加…

Vue 3使用 Socket

在 Vue 3 中使用 Socket&#xff08;如 WebSocket 或基于 WebSocket 的庫比如 Socket.IO&#xff09;可以通過組合式 API&#xff08;Composition API&#xff09;來實現得更清晰、模塊化。下面我給你展示一個完整的例子&#xff0c;包括使用原生 WebSocket 和使用 Socket.IO 的…

云計算:探索現代科技的未來之云

文章目錄 云計算基本概念云計算是什么注意 云計算的價值云計算的部署模式云計算的服務模式主流的云計算技術AWS簡介AWS建立了廣闊的合作伙伴生態 VMware簡介VMware服務介紹 華為云簡介華為云Stack模式 云計算基本概念 云計算是什么 云計算是一種模型&#xff0c;它可以實現隨時…

光學像差的類型與消除方法

### **光學像差的類型、理解與消除方法** 光學像差是指實際光學系統成像時&#xff0c;由于透鏡或反射鏡的非理想特性導致的光線偏離理想路徑&#xff0c;從而影響成像質量的現象。像差可分為**單色像差**&#xff08;與波長無關&#xff09;和**色差**&#xff08;與波長相關…

什么是ecovadis驗廠?ecovadis驗廠的好處?ecovadis驗廠的重要意義

1. 什么是EcoVadis驗廠&#xff1f; EcoVadis驗廠&#xff08;又稱EcoVadis評估&#xff09;是國際權威的 企業社會責任&#xff08;CSR&#xff09;和可持續發展&#xff08;ESG&#xff09;在線評估&#xff0c;通過審核企業在 環境、勞工與人權、商業道德、可持續采購 四大…

STM32蜂鳴器播放音樂

STM32蜂鳴器播放音樂 STM32蜂鳴器播放音樂 Do, Re, Mi, Fa, 1. 功能概述 本系統基于STM32F7系列微控制器&#xff0c;實現了以下功能&#xff1a; 通過7個按鍵控制蜂鳴器發聲&#xff0c;按鍵對應不同的音符。每個按鍵對應一個音符&#xff08;Do, Re, Mi, Fa, Sol, La, Si&a…

基于 OCO - 2 氧氣 A 帶輻射數據與地面臺站氣壓觀測數據構建近地面氣壓監測算法方案

基于 OCO - 2 氧氣 A 帶輻射數據與地面臺站氣壓觀測數據構建近地面氣壓監測算法方案 一、數據獲取與準備 (一)OCO - 2 氧氣 A 帶輻射數據 數據下載:從 OCO - 2 官方數據發布平臺(如 NASA 的相關數據存儲庫),按照研究所需的時間范圍(例如,近 5 年的數據以獲取足夠的樣本…

程序員英語口語練習筆記

我是一個程序員&#xff0c;專注于Java, Linux和k8s. I’m a programmer specializing in Java, Linux, and Kubernetes. 這個不是我的bug。 I don’t think this bug is caused by my work. 你能幫我看一下這個代碼嗎&#xff1f; Can you take a look at this code for me?…

網絡地址轉換技術(2)

NAT的配置方法&#xff1a; &#xff08;一&#xff09;靜態NAT的配置方法 進入接口視圖配置NAT轉換規則 Nat static global 公網地址 inside 私網地址 內網終端PC2&#xff08;192.168.20.2/24&#xff09;與公網路由器AR1的G0/0/1&#xff08;11.22.33.1/24&#xff09;做…

從零開始理解基于深度學習的語義分割模型:RCA與RCM模塊的實現

從零開始理解基于深度學習的語義分割模型:RCA與RCM模塊的實現 隨著深度學習技術的發展,圖像分割任務取得了長足的進步。本文將從一個具體的PyTorch代碼實例出發,帶大家了解一種 novel 的語義分割網絡架構——RCA(Rectangular Self-Calibration Attention)和 RCM(Rectang…

【Linux網絡-多路轉接select】

代碼&#xff1a;https://gitee.com/nanyi-c/linux/tree/master/day50 一、I/O多路轉接之select 1.初始select 系統提供select函數來實現多路復用輸入/輸出模型 select系統調用是用來讓我們的程序監視多個文件描述符的狀態變化的程序會停在select這里等待&#xff0c;直到被…