文章目录

  • 前言
  • 一、华为云ModelArts-Notebook介绍
    • 1.华为云ModelArts-Notebook
      • 1.1 Jupyter Notebook是什么
      • 1.2 JupyterLab是什么
      • 1.3 什么是Moxing
    • 2.Python-Opencv
  • 二、本地案例实现Python定制我的《本草纲目女孩》
    • 1.案例实现流程
    • 2.案例环境部署
      • 2.1 本机环境
      • 2.2 安装对应的anaconda包
      • 2.3 安装opencv-python
    • 3.案例实现代码
      • 3.1 导入数据
      • 3.2 导入库函数
      • 3.3 将视频转化为图像帧
      • 3.4 对图片帧进行ASCII码的转换
      • 3.5 将转换好的图片帧合成视频
      • 3.6 主函数
      • 3.7 运行结果
    • 4.案例播放代码
  • 三、华为云AI实现Python定制我的《本草纲目女孩》
    • 1.基础配置
    • 2.导入数据
    • 3.安装相关依赖
    • 4.导入库函数
    • 5.将视频转化为图像帧
    • 6.对图片帧进行ASCII码的转换
    • 7.将转换好的图片帧合成视频
    • 8.运行主函数
    • 9.播放视频
  • 总结

前言

近日,《本草纲目》毽子操的视频刷屏网络。公司里更是多了很多刘畊宏女孩,在520到来之际特意奉献这篇文章给大家。如果有心仪的女孩这篇文章可以帮助你哦。

歌词:抬腿!拍腿!,侧边的肥肉咔咔掉,人鱼线马甲线我都要!刘畊宏的男孩女孩看过来。

让我们来用Python定制出心仪的“本草纲目女孩”,敲出魔性的代码舞蹈,520,准备好心仪女孩的舞蹈视频,把这份别出心裁的礼物给TA❤️。

一、华为云ModelArts-Notebook介绍

1.华为云ModelArts-Notebook

ModelArts集成了基于开源的Jupyter Notebook和JupyterLab,可为您提供在线的交互式开发调试工具。您无需关注安装配置,在ModelArts管理控制台直接使用Notebook,编写和调测模型训练代码,然后基于该代码进行模型的训练。

其中,ModelArts还提供了华为自研的分布式训练加速框架MoXing,您可以在Notebook中使用MoXing编写训练脚本,让您代码编写更加高效、代码更加简洁。

1.1 Jupyter Notebook是什么

Jupyter Notebook是一个可以在浏览器中使用的交互式的计算应用程序,该应用程序的所有可见的内容,以笔记本文档表示,包括计算的输入和输出、解释文本、数学、图像和对象的富媒体等表示。因此,Jupyter Notebook可以实现将代码、文字完美结合起来,非常适合从事机器学习、数据分析等数据科学工作的人员。

Jupyter Notebook相关文档:https://docs.jupyter.org/en/latest/

1.2 JupyterLab是什么

JupyterLab是一个交互式的开发环境,是Jupyter Notebook的下一代产品,可以使用它编写Notebook、操作终端、编辑MarkDown文本、打开交互模式、查看csv文件及图片等功能。

JupyterLab相关文档:https://jupyterlab.readthedocs.io/en/stable/

1.3 什么是Moxing

MoXing是华为云ModelArts团队自研的分布式训练加速框架,它构建于开源的深度学习引擎TensorFlow、MXNet、PyTorch、Keras之上。相对于TensorFlow和MXNet原生API而言,MoXing API让模型代码的编写更加简单,允许用户只需要关心数据输入(input_fn)和模型构建(model_fn)的代码,即可实现任意模型在多GPU和分布式下的高性能运行,降低了TensorFlow和MXNet的使用门槛。另外,MoXing-TensorFlow还将支持自动超参选择和自动模型结构搜索,用户无需关心超参和模型结构,做到模型全自动学习。

Moxing相关文档:https://github.com/huaweicloud/ModelArts-Lab/tree/master/docs/moxing_api_doc

2.Python-Opencv

Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆于1990年代初设计,作为一门叫做ABC语言的替代品。Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。

Python解释器易于扩展,可以使用C语言或C++(或者其他可以通过C调用的语言)扩展新的功能和数据类型。Python也可用于可定制化软件中的扩展程序语言。Python丰富的标准库,提供了适用于各个主要系统平台的源码或机器码。

OpenCV用C++语言编写,它具有C++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令,如今也提供对于C#、Ch、Ruby,GO的支持。

opencv-python的github网址:https://pypi.org/project/opencv-python/

OpenCV官网:https://opencv.org/

二、本地案例实现Python定制我的《本草纲目女孩》

1.案例实现流程

众所周知,视频是由一帧帧图像构成,Opencv处理视频图像信息的原理就是将视频转为一帧帧图像,处理完图像后再转换为视频。

用Python实现案例流程如下:

2.案例环境部署

2.1 本机环境

  • vs2022
  • anaconda(已经包括opencv和PIL)
  • python

2.2 安装对应的anaconda包

anaconda这是一个非常常用的python包集成管理工具,其中预安装了很多python库,使得我们不需要去手动安装各种的第三方库,我们知道自己取手动安装的过程中,很容易就会遇到一些报错,解决起来也非常的麻烦。

anaconda官网:https://www.anaconda.com/products/distribution#Downloads

下载完软件包一路点击安装就行了,安装成功后会出现如下界面。

查看是否安装成功命令:conda --version

2.3 安装opencv-python

进入anaconda控制台输入如下命令:

pip install opencv-python

3.案例实现代码

本案例的实现过程主要分为以下几步:

1. 导入数据
2. 导入库函数
3. 将视频转化为图像帧
4. 对图片帧进行ASCII码的转换
5. 将转换好的图片帧合成视频

3.1 导入数据

视频下载地址:https://cnnorth4-modelhub-datasets-obsfs-sfnua.obs.cn-north-4.myhuaweicloud.com/content/35d24c0e-f337-442b-935f-ef8123062d3e/QzNm9F/dataset/test_demo0510.mp4

3.2 导入库函数

#导入Python库
import cv2
from PIL import Image,ImageFont,ImageDraw
import os
from cv2 import VideoWriter, VideoWriter_fourcc, imread, resize

3.3 将视频转化为图像帧

#将视频转换为图片存入目标文件夹def video_to_pic(vp):number = 0# 判断载入的视频是否可以打开if vp.isOpened():#r:布尔型 (True 或者False),代表有没有读取到图片,frame:表示截取到的一帧的图片的数据,是个三维数组r,frame = vp.read()#判断文件夹是否存在,不存在的话则新建文件夹if not os.path.exists('cache_pic'):os.mkdir('cache_pic')os.chdir('cache_pic')else:r = False#遍历视频,并将每一帧图片写入文件夹while r:number += 1cv2.imwrite(str(number)+'.jpg',frame)r,frame = vp.read()print('\n由视频一共生成了{}张图片!'.format(number))# 修改当前工作目录至主目录os.chdir("..")return number

3.4 对图片帧进行ASCII码的转换

#将图片进行批量化处理def star_to_char(number, save_pic_path):#判断文件夹是否存在,不存在的话则新建文件夹if not os.path.exists('cache_char'):os.mkdir('cache_char')# 生成目标图片文件的路径列表img_path_list = [save_pic_path + r'/{}.jpg'.format(i) for i in range(1, number + 1)]task = 0for image_path in img_path_list:# 获取图片的分辨率img_width, img_height = Image.open(image_path).sizetask += 1#处理图片,并显示处理进程img_to_char(image_path, img_width, img_height, task)print('{}/{} is processed.'.format(task, number))print('=======================')print('All pictures were processed!')print('=======================')return 0# 将图片转换为灰度图像后进行ascii_char中的ASCII值输出
# 函数输入像素RGBA值,输出对应的字符码。其原理是将字符均匀地分布在整个灰度范围内,像素灰度值落在哪个区间就对应哪个字符码。def get_char(r, g, b, alpha=256):#ascii_char就是字符列表,用来将不同灰度的像素进行不同字符体替换的参照。ascii_char = list("#RMNHQODBWGPZ*@$C&98?32I1>!:-;. ")#alpha在为0的时候便是完全透明的图片,所以返回空if alpha == 0:return ''length = len(ascii_char)#转为灰度图#RGBA是代表Red(红色)、Green(绿色)、Blue(蓝色)和Alpha的色彩空间,Alpha通道一般用作不透明度参数#如果一个像素的alpha通道数值为0%,那它就是完全透明的,而数值为100%则意味着一个完全不透明的像素gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)# unit = (256.0 + 1) / len(ascii_char)unit = 256 / len(ascii_char)return ascii_char[int(gray / unit)]def img_to_char(image_path, raw_width, raw_height, task):width = int(raw_width / 6)height = int(raw_height / 15)# 以RGB模式打开im = Image.open(image_path).convert('RGB')im = im.resize((width, height), Image.NEAREST)txt = ''color = []#遍历图片的每个像素for i in range(height):for j in range(width):pixel = im.getpixel((j, i))# 将颜色加入进行索引color.append((pixel[0], pixel[1], pixel[2]))if len(pixel) == 4:txt += get_char(pixel[0], pixel[1], pixel[2], pixel[3])else:txt += get_char(pixel[0], pixel[1], pixel[2])txt += '\n'color.append((255, 255, 255))im_txt = Image.new("RGB", (raw_width, raw_height), (255, 255, 255))dr = ImageDraw.Draw(im_txt)font = ImageFont.load_default().fontx, y = 0, 0font_w, font_h = font.getsize(txt[1])font_h *= 1.37  # 调整字体大小for i in range(len(txt)):if (txt[i] == '\n'):x += font_hy = -font_wdr.text((y, x), txt[i], fill=color[i])y += font_w#存储处理后的图片至文件夹os.chdir('cache_char')im_txt.save(str(task) + '.jpg')#直接进入新创建的文件夹将生成的图片直接存入文件夹中os.chdir("..")return 0

3.5 将转换好的图片帧合成视频

# 进度条显示
def process_bar(percent, start_str='', end_str='', total_length=0):bar = ''.join("■ " * int(percent * total_length)) + ''bar = '\r' + start_str + bar.ljust(total_length) + ' {:0>4.1f}%|'.format(percent * 100) + end_strprint(bar, end='', flush=True)#图片帧合成视频def jpg_to_video(char_image_path, FPS):# 设置视频编码器,这里使用MP42编码器video_fourcc = VideoWriter_fourcc(*"MP42")# 生成目标字符图片文件的路径列表char_img_path_list = [char_image_path + r'/{}.jpg'.format(i) for i in range(1, number + 1)]# 获取图片的分辨率char_img_test = Image.open(char_img_path_list[1]).sizeif not os.path.exists('video'):os.mkdir('video')video_writter = VideoWriter('video/output.avi', video_fourcc, FPS, char_img_test)sum = len(char_img_path_list)count = 0for image_path in char_img_path_list:img = cv2.imread(image_path)video_writter.write(img)end_str = '100%'count = count + 1process_bar(count / sum, start_str='', end_str=end_str, total_length=15)video_writter.release()print('\n')print('=======================')print('The video is finished!')print('=======================')

3.6 主函数

if __name__ == "__main__":#初始视频路径video_path = 'test_demo0510.mp4'#原始视频转为图片的图片保存路径save_pic_path = 'cache_pic'#图片经处理后的图片保存路径save_charpic_path = 'cache_char'# 读取视频vp = cv2.VideoCapture(video_path)# 将视频转换为图片 并进行计数,返回总共生成了多少张图片number = video_to_pic(vp)# 计算视频帧数FPS = vp.get(cv2.CAP_PROP_FPS)# 将图像进行字符串处理后star_to_char(number, save_pic_path)vp.release()# 将图片合成为视频jpg_to_video(save_charpic_path, FPS)

3.7 运行结果

运行后一共生成了382张图片,和视频文件,保存在如下文件夹下。

4.案例播放代码

import cv2
from IPython.display import clear_output, Image, displaydef show_video(video_path, show_text):video = cv2.VideoCapture(video_path)while True:try:clear_output(wait=True)# 读取视频ret, frame = video.read()if not ret:breakheight, width, _ = frame.shapecv2.putText(frame, show_text, (0, 100), cv2.FONT_HERSHEY_TRIPLEX, 3.65, (255, 0, 0), 2)frame = cv2.resize(frame, (int(width / 2), int(height / 2)))_, ret = cv2.imencode('.jpg', frame)display(Image(data=ret))except KeyboardInterrupt:video.release()#视频循环播放
i=1
while i>0:show_video('video/output.avi',str(i))i=i+1

三、华为云AI实现Python定制我的《本草纲目女孩》

1.基础配置

"本草纲目"健身操字符串视频操作实例的案例页面如下:https://developer.huaweicloud.com/develop/aigallery/Notebook/detail?id=c81526e5-cc88-497f-8a21-41a5632e014e

点击Run in ModelArts,进入JupyterLab页面。

配置当前运行环境,切换规格,并选择免费的就好了。

2.导入数据

选择下方代码,点击运行。

运行完成后如下:

3.安装相关依赖

选择下方代码,点击运行安装opencv包

pip install opencv_python

4.导入库函数

#导入Python库
import cv2
from PIL import Image,ImageFont,ImageDraw
import os
from cv2 import VideoWriter, VideoWriter_fourcc, imread, resize

5.将视频转化为图像帧

#将视频转换为图片存入目标文件夹def video_to_pic(vp):number = 0# 判断载入的视频是否可以打开if vp.isOpened():#r:布尔型 (True 或者False),代表有没有读取到图片,frame:表示截取到的一帧的图片的数据,是个三维数组r,frame = vp.read()#判断文件夹是否存在,不存在的话则新建文件夹if not os.path.exists('cache_pic'):os.mkdir('cache_pic')os.chdir('cache_pic')else:r = False#遍历视频,并将每一帧图片写入文件夹while r:number += 1cv2.imwrite(str(number)+'.jpg',frame)r,frame = vp.read()print('\n由视频一共生成了{}张图片!'.format(number))# 修改当前工作目录至主目录os.chdir("..")return number

6.对图片帧进行ASCII码的转换

#将图片进行批量化处理def star_to_char(number, save_pic_path):#判断文件夹是否存在,不存在的话则新建文件夹if not os.path.exists('cache_char'):os.mkdir('cache_char')# 生成目标图片文件的路径列表img_path_list = [save_pic_path + r'/{}.jpg'.format(i) for i in range(1, number + 1)]task = 0for image_path in img_path_list:# 获取图片的分辨率img_width, img_height = Image.open(image_path).sizetask += 1#处理图片,并显示处理进程img_to_char(image_path, img_width, img_height, task)print('{}/{} is processed.'.format(task, number))print('=======================')print('All pictures were processed!')print('=======================')return 0# 将图片转换为灰度图像后进行ascii_char中的ASCII值输出
# 函数输入像素RGBA值,输出对应的字符码。其原理是将字符均匀地分布在整个灰度范围内,像素灰度值落在哪个区间就对应哪个字符码。def get_char(r, g, b, alpha=256):#ascii_char就是字符列表,用来将不同灰度的像素进行不同字符体替换的参照。ascii_char = list("#RMNHQODBWGPZ*@$C&98?32I1>!:-;. ")#alpha在为0的时候便是完全透明的图片,所以返回空if alpha == 0:return ''length = len(ascii_char)#转为灰度图#RGBA是代表Red(红色)、Green(绿色)、Blue(蓝色)和Alpha的色彩空间,Alpha通道一般用作不透明度参数#如果一个像素的alpha通道数值为0%,那它就是完全透明的,而数值为100%则意味着一个完全不透明的像素gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)# unit = (256.0 + 1) / len(ascii_char)unit = 256 / len(ascii_char)return ascii_char[int(gray / unit)]def img_to_char(image_path, raw_width, raw_height, task):width = int(raw_width / 6)height = int(raw_height / 15)# 以RGB模式打开im = Image.open(image_path).convert('RGB')im = im.resize((width, height), Image.NEAREST)txt = ''color = []#遍历图片的每个像素for i in range(height):for j in range(width):pixel = im.getpixel((j, i))# 将颜色加入进行索引color.append((pixel[0], pixel[1], pixel[2]))if len(pixel) == 4:txt += get_char(pixel[0], pixel[1], pixel[2], pixel[3])else:txt += get_char(pixel[0], pixel[1], pixel[2])txt += '\n'color.append((255, 255, 255))im_txt = Image.new("RGB", (raw_width, raw_height), (255, 255, 255))dr = ImageDraw.Draw(im_txt)font = ImageFont.load_default().fontx, y = 0, 0font_w, font_h = font.getsize(txt[1])font_h *= 1.37  # 调整字体大小for i in range(len(txt)):if (txt[i] == '\n'):x += font_hy = -font_wdr.text((y, x), txt[i], fill=color[i])y += font_w#存储处理后的图片至文件夹os.chdir('cache_char')im_txt.save(str(task) + '.jpg')#直接进入新创建的文件夹将生成的图片直接存入文件夹中os.chdir("..")return 0

7.将转换好的图片帧合成视频

# 进度条显示
def process_bar(percent, start_str='', end_str='', total_length=0):bar = ''.join("■ " * int(percent * total_length)) + ''bar = '\r' + start_str + bar.ljust(total_length) + ' {:0>4.1f}%|'.format(percent * 100) + end_strprint(bar, end='', flush=True)#图片帧合成视频def jpg_to_video(char_image_path, FPS):# 设置视频编码器,这里使用MP42编码器video_fourcc = VideoWriter_fourcc(*"MP42")# 生成目标字符图片文件的路径列表char_img_path_list = [char_image_path + r'/{}.jpg'.format(i) for i in range(1, number + 1)]# 获取图片的分辨率char_img_test = Image.open(char_img_path_list[1]).sizeif not os.path.exists('video'):os.mkdir('video')video_writter = VideoWriter('video/output.avi', video_fourcc, FPS, char_img_test)sum = len(char_img_path_list)count = 0for image_path in char_img_path_list:img = cv2.imread(image_path)video_writter.write(img)end_str = '100%'count = count + 1process_bar(count / sum, start_str='', end_str=end_str, total_length=15)video_writter.release()print('\n')print('=======================')print('The video is finished!')print('=======================')

8.运行主函数

if __name__ == "__main__":#初始视频路径video_path = 'test_demo0510.mp4'#原始视频转为图片的图片保存路径save_pic_path = 'cache_pic'#图片经处理后的图片保存路径save_charpic_path = 'cache_char'# 读取视频vp = cv2.VideoCapture(video_path)# 将视频转换为图片 并进行计数,返回总共生成了多少张图片number = video_to_pic(vp)# 计算视频帧数FPS = vp.get(cv2.CAP_PROP_FPS)# 将图像进行字符串处理后star_to_char(number, save_pic_path)vp.release()# 将图片合成为视频jpg_to_video(save_charpic_path, FPS)

等待主函数执行完成,后会生成如下三个文件夹:

9.播放视频

总结

本文主要介绍了本地开发和华为云ModelArts开发两种形式,从开发流程中大家也明白那种形式开发更简单。

ModelArts是面向开发者的一站式AI开发平台,为机器学习与深度学习提供海量数据预处理及半自动化标注、大规模分布式Training、自动化模型生成,及端-边-云模型按需部署能力,帮助用户快速创建和部署模型,管理全周期AI工作流。

华为云ModelArts-Notebook云开发的优势不需要本地进行安装资源包,在ModelArts-Notebook环境就已经集成了这些环境,减少了人为部署压力,更易于上手、更高性能、一站式服务、支持多种主流框架。


本文整理自华为云社区【内容共创】活动第16期。

查看活动详情:https://bbs.huaweicloud.com/blogs/352652

相关任务详情:任务1.用Python定制我的“本草纲目女孩”

【云驻共创】华为云AI之用Python定制我的《本草纲目女孩》相关推荐

  1. 【云驻共创】云原生应用架构之企业核心业务未来架构演进路线及华为云方案

    文章目录 前言 一.企业核心业务架构演进 1.企业核心业务应用架构和集成架构发展历程 1.1 企业核心业务应用架构发展历程 1.1.1 单体架构 1.1.1.1 特点 1.1.1.2 优点 1.1.1 ...

  2. 【云驻共创】华为云IoT数据分析流程实操

    文章目录 一.数据分析的发展 1.数据分析概念 1.1 数据分析的背景 1.2 数据分析的目的 1.3数据分析的定义 2.物联网数据分析概念 3.华为云IoT数据分析优势 二.华为云IoT数据分析服务 ...

  3. 【云驻共创】华为云AI之《情感专家》在线分析影评情感基调

    文章目录 前言 一.Word Embedding 二.BERT原理 1.Pre-training预训练 2.Deep Bidirectional Transformers 3.BERT中的双向表示 4 ...

  4. 【云驻共创】华为云HCIA-IoT V2.5培训系列内容之物联网概览

    文章目录 前言 一.物联网发展简史与概述 1.物联网的发展简史 1.1 物联网的起源 1.2 物联网的发展 1.3 物联网大事件 1.3.1 NB-IOT标准的引进 1.3.2 工信部宣布5G商用 1 ...

  5. 【云驻共创】华为云IoTDA服务下的设备管理流程实操

    文章目录 一.当今社会发展趋势 1.社会背景 2.什么是物联网(IoT) 3.什么是华为云(IoTDA) 二.为什么需要设备发放 1.传统模式-存在问题 2.设备发放模式-问题改进 三.设备接入服务的 ...

  6. 【云驻共创】华为云之锁与权限为您的数仓保驾护航

    文章目录 前言 1.锁的介绍 2.权限的介绍 一.DWS锁机制介绍&排查处理方法 1.华为云数仓DWS的概念 2.事务隔离性问题分析 3.数据库并发场景 4.锁机制 4.1 MVCC介绍 4. ...

  7. 【云驻共创】华为云云原生之Kubernetes网络架构原理深度剖析(上)

    文章目录 前言 一.Kubernetes诞生背景 1.云原生的概念 2.云原生架构 3.Kubernetes(k8s) 二.Kubernetes基本网络模型剖析 1.概念厘清 1.1 二层桥接 VS ...

  8. 【云驻共创】华为云云原生之Istio控制面架构深度剖析

    文章目录 前言 一.Istio的基本概念 1.Istio诞生背景 2.Istio的定义 3.Istio优势 二.Istio整体架构及工作原理 1.Istio整体架构 1.1 控制面Istiod 1.1 ...

  9. 【华为云-云驻共创】Docker是什么?有哪些应用场景?

    文章目录 前言 容器技术的起源 什么是容器? 容器与虚拟机 为什么需要容器? 容器的优势 对于开发人员 - Build Once, Run Anywhere 对于运维人员 - Configure On ...

最新文章

  1. PHP China杨格:PHP China 是开发者的“家”
  2. Git版本管理工具的使用
  3. Servlet_执行原理
  4. 英语笔记:词组句子:0812
  5. Qlik 助力安井食品实现企业智能决策、高效运营
  6. myeclipse连接mysql生成数据表时中文字符乱码或问号(解决方法)
  7. matlab简单分析模拟滤波器 IIR
  8. Mac mysql 忘记 root 密码,phpmyadmin 登录 No such file or directory 错误处理
  9. 这 8 个 Python 技巧让你的数据分析提升数倍!
  10. C# 匿名对象(匿名类型)、var、动态类型 dynamic
  11. springSecurity jwt 如何融合
  12. AB罗克韦尔-pid教程
  13. 实现仿微信朋友圈评论输入框
  14. 酷狗音乐的临时缓存文件转换为MP3文件,java源码
  15. 微信小程序开发者工具构建npm
  16. Android 视频裁剪自定义 View
  17. 周博通 | 阿里开源首个 DL 框架、4000台服务器真实数据集;明年1月开源Blink
  18. Vue学习随笔+商城项目【上】
  19. Android GridView实现自定义日程表课表
  20. 泥巴与互联网里长大的小孩

热门文章

  1. 量化投资学习-7:图解股市的基本面、技术面、市场环境面的关系
  2. Android开发周报:Android Studio2.0发布、Activity动态创建
  3. WH-1000XM3蓝牙连接笔记本电脑
  4. 开了店铺没访客没流量?Shopee店铺日常运营引流方式来啦
  5. Intel graphics HD 4600 核芯显卡 对比 nVIDIA Geforce GTX 750 2GB GDDR5 独立显卡
  6. 骑士CMS4.1.23本地包含漏洞
  7. 中医病案管理、编码、质控、直报、统计系统--正在开发中
  8. C#飞机大战案例详细教程
  9. 电气无级变速器(EVT)混合动力传动系半实物仿真平台ETest
  10. mysql 导入tsv文件_HBase数据迁移(2)- 使用bulk load 工具从TSV文件中导入数据