using Pkg # 检查并安装必要依赖 function install_dependencies() # PyCall 包验证 pycall_uuid = Base.UUID("438e738f-606a-5dbb-bf0a-cddfbfd45ab0") if !haskey(Pkg.dependencies(), pycall_uuid) println("正在安装 PyCall 依赖...") Pkg.add("PyCall") end # Images 包验证 images_uuid = Base.UUID("916415d5-f1e6-5110-898d-aaa5f9f070e0") if !haskey(Pkg.dependencies(), images_uuid) println("正在安装 Images 依赖...") Pkg.add("Images") end end # 动态加载模块 function load_modules() @eval using PyCall @eval using Images @eval using PyCall: PyReverseDims end # OpenCV初始化 function init_opencv() try global cv2 = pyimport("cv2") catch e println("正在安装 OpenCV 依赖...") pyimport_conda("cv2", "opencv") global cv2 = pyimport("cv2") end end # 视频处理主函数 function video_processor(input_file, output_file; processing_func=identity) # 创建视频捕获对象 cap = cv2.VideoCapture(input_file) !cap.isOpened() && error("无法打开视频文件") # 获取视频参数 video_params = Dict( :width => Int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), :height => Int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)), :fps => cap.get(cv2.CAP_PROP_FPS), :total_frames => Int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) ) # 创建视频写入对象 fourcc = cv2.CAP_OPENCV_MJPEG output = cv2.VideoWriter(output_file, fourcc, video_params[:fps], (video_params[:width], video_params[:height])) frame_counter = 0 try while true ret, frame = cap.read() ret || break # 处理帧数据 processed_frame = processing_func(frame) output.write(processed_frame) # 进度显示 frame_counter += 1 if frame_counter % 100 == 0 println("已处理帧数: $(frame_counter)/$(video_params[:total_frames])") end end finally cap.release() output.release() println("视频处理完成") end return frame_counter end # 维度转换工具函数 function convert_dimension(input_array) reversed_dims = permutedims(input_array, ndims(input_array):-1:1) return PyReverseDims(reversed_dims) end # 自定义帧处理函数 function frame_analyzer(frame) frame_height, frame_width = size(frame)[1:2] # 定义处理参数 kernel_size = 5 # 可调节的滤波器尺寸 mask_coords = (162, 485, 360, 699) # 掩膜坐标范围 # 创建掩膜矩阵 mask_matrix = zeros(UInt8, frame_height, frame_width) mask_matrix[mask_coords[1]:mask_coords[2], mask_coords[3]:mask_coords[4]] .= 1 # 灰度转换 grayscale = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) masked_gray = grayscale .* mask_matrix # 中值滤波 blurred_image = cv2.medianBlur(masked_gray, kernel_size) # 边缘检测 gradient_x = cv2.Sobel(blurred_image, cv2.CV_64F, 1, 0) gradient_y = cv2.Sobel(blurred_image, cv2.CV_64F, 0, 1) absolute_gradients = map(x -> cv2.convertScaleAbs(x), [gradient_x, gradient_y]) combined_gradient = cv2.addWeighted(absolute_gradients..., 0.5, 0) # 归一化处理 normalized_sobel = round.(255 * combined_gradient / maximum(combined_gradient)) binary_edges = convert.(UInt8, normalized_sobel) .>= 68 edge_image = UInt8.(binary_edges) .* 255 # 轮廓检测 contours, _ = cv2.findContours(convert_dimension(edge_image), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) # 筛选有效轮廓 valid_contours = filter(c -> cv2.contourArea(c) > 15, contours) # 绘制最终结果 if !isempty(valid_contours) all_points = vcat([reshape(c, :, 2) for c in valid_contours]...) combined_hull = cv2.convexHull(convert_dimension(all_points)) result_frame = cv2.drawContours(convert_dimension(frame), [combined_hull], 0, (0, 0, 255), 2) else result_frame = frame end return result_frame end # 执行主程序 function main() install_dependencies() load_modules() init_opencv() input_video = "D:\\2345Downloads\\Syslab\\Experiment2.mp4" output_video = "D:\\2345Downloads\\Syslab\\test.mp4" processed_frames = video_processor(input_video, output_video, processing_func=frame_analyzer) println("总处理帧数: $processed_frames") end # 启动处理流程 main()