y = 8
def main():
x = 4
x = mystery(x + 1)
print(y, s)
def mystery(x):
s = 0
for i in range(x):
x = i + 1
s = s + x
return s
这段程序存在一个变量作用域的错误,具体表现为在函数main()中调用mystery()函数,但是mystery()函数中定义的变量s和i无法在main()函数中直接访问和使用。
解决方案是需要将mystery()函数中定义的变量s和i作为函数的返回值,然后将其作为参数传递给main()函数,实现数据共享和传递。
以下是修改后的程序代码:
y = 8
def main():
x = 4
s, i = mystery(x + 1)
print(y, s)
def mystery(x):
s = 0
for i in range(x):
x = i + 1
s = s + x
return s, i
main()
在这个修改过的程序中,mystery()函数返回了两个值s和i,main()函数接收这两个值,然后进行打印输出。通过这种方式,实现了数据的传递和共享。
s这个变量是在mystery申明的,所以其作用域只在mystery方法中起作用,因此不可以在main中使用s , mystery方法的返回值已经赋值给x了,因此,修改方案直接将s修改为x即可:
print(y, x)
导入工具
import cv2
import face_recognition
import matplotlib.pyplot as plt
# %matplotlib inline # 在 jupyter 中使用的时候,去掉注释
import ffmpy3
import subprocess
import os
from PIL import Image
图像处理,自动跟踪打码
def mask_video(input_video, output_video, mask_path='mask.jpg'):
# 打码图片
mask = cv2.imread(mask_path)
# 读取视频
cap = cv2.VideoCapture(input_video)
# 读取视频参数,fps、width、heigth
CV_CAP_PROP_FPS = 5
CV_CAP_PROP_FRAME_WIDTH = 3
CV_CAP_PROP_FRAME_HEIGHT = 4
v_fps = cap.get(CV_CAP_PROP_FPS)
v_width = cap.get(CV_CAP_PROP_FRAME_WIDTH)
v_height = cap.get(CV_CAP_PROP_FRAME_HEIGHT)
# 设置写视频参数,格式为 mp4
size = (int(v_width), int(v_height))
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
out = cv2.VideoWriter(output_video, fourcc, v_fps, size)
已知人脸
known_image = face_recognition.load_image_file("tmr.jpg")
biden_encoding = face_recognition.face_encodings(known_image)[0]
读取视频
cap = cv2.VideoCapture(input_video)
while (cap.isOpened()):
ret, frame = cap.read()
if ret:
# 检测人脸
face_locations = face_recognition.face_locations(frame)
# print(face_locations)
# 检测每一个人脸
for (top_right_y, top_right_x, left_bottom_y, left_bottom_x) in face_locations:
unknown_image = frame[top_right_y - 50:left_bottom_y + 50, left_bottom_x - 50:top_right_x + 50]
print(face_recognition.face_encodings(unknown_image))
if face_recognition.face_encodings(unknown_image) != []:
unknown_encoding = face_recognition.face_encodings(unknown_image)[0]
# 对比结果
results = face_recognition.compare_faces([biden_encoding], unknown_encoding)
# 是仝卓,就将打码贴图。
if results[0] == True:
mask = cv2.resize(mask, (top_right_x - left_bottom_x, left_bottom_y - top_right_y))
frame[top_right_y:left_bottom_y, left_bottom_x:top_right_x] = mask
# 写入视频
out.write(frame)
else:
break
保存视频
if __name__ == '__main__':
# 将音频保存为cut.mp3
video2mp3(file_name='cut.mp4')
# 处理视频,自动打码,输出视频为output.mp4
mask_video(input_video='cut.mp4', output_video='output.mp4')
# 为 output.mp4 处理好的视频添加声音
video_add_mp3(file_name='output.mp4', mp3_file='cut.mp3')
答案:
问题分析:变量的值在函数内部无法被访问,这很可能是变量作用域的问题。在函数内部定义的变量默认为局部变量,只能在函数内部使用;而在函数外部定义的变量则为全局变量,可以在整个程序中使用。
解决方案:可以通过以下一些方法来解决变量作用域的问题:
1.将变量定义为全局变量:在函数外部定义变量,就可以在整个程序中使用了。
var globalVar = "I am a global variable"; //定义一个全局变量
function myFunction() {
console.log(globalVar); //在函数中使用全局变量
}
myFunction(); //输出"I am a global variable"
2.将变量作为函数的参数传递: 将需要在函数内部使用的变量作为参数传递给函数。
function myFunction(myVar) {
console.log(myVar); //在函数中使用传递的变量
}
var myVar = "I am a variable"; //定义一个变量
myFunction(myVar); //输出"I am a variable"
3.使用闭包:闭包可以创建私有变量,在函数内部也可以访问。
function myFunction() {
var myVar = "I am a private variable"; //定义一个私有变量
return function() {
console.log(myVar); //在返回的函数中使用私有变量
}
}
var closureFunc = myFunction();
closureFunc(); //输出"I am a private variable"
以上是三种解决方案的示例代码,可以根据具体情况选择合适的方法来解决变量作用域问题。