仿射变换简介

什么是放射变换

图像上的仿射变换, 其实就是图片中的一个像素点,通过某种变换,移动到另外一个地方。

从数学上来讲, 就是一个向量空间进行一次线形变换并加上平移向量, 从而变换到另外一个向量空间的过程。

向量空间m : m=(x,y)

向量空间n : n=(x′,y′)

向量空间从m到n的变换 n=A∗m+b

整理得到:

将A跟b 组合在一起就组成了仿射矩阵 M。 它的维度是2∗3

使用不同的矩阵M,就获得了不同的2D仿射变换效果。

在opencv中,实现2D仿射变换, 需要借助warpAffine 函数。

cv2.warpAffine(image, M, (image.shape[1], image.shape[0])

接下来,带你结合具体的2D仿射变换,分析其变换矩阵。

图像平移

公式推导

平移可以说是最简单的一种空间变换。其表达式为:

其中(b0,b1) 是偏移量。

例程

如果是向右平移10个像素, 向下平移30个像素的话, 那么变换矩阵M可以为:

演示代码

向右平移10个像素, 向下平移30个像素:

import cv2

import numpy as np

img = cv2.imread('lena1.jpg')

height,width,channel = img.shape

# 声明变换矩阵 向右平移10个像素, 向下平移30个像素

M = np.float32([[1, 0, 10], [0, 1, 30]])

# 进行2D 仿射变换

shifted = cv2.warpAffine(img, M, (width, height))

cv2.imwrite('shift_right_10_down_30.jpg', shifted)

原始图像:

向右平移10个像素, 向下平移30个像素图像:

向左平移10个像素, 向上平移30个像素:

# 声明变换矩阵 向左平移10个像素, 向上平移30个像素

M = np.float32([[1, 0, -10], [0, 1, -30]])

# 进行2D 仿射变换

shifted = cv2.warpAffine(img, M, (width, height))

cv2.imwrite('shift_right_-10_down_-30.jpg', shifted)

仿射变换图像:

图像平移v2

我们可以用translate这个函数把这个操作封装一下:

def translate(image, x, y):

M = np.float32([[1, 0, x], [0, 1, y]])

shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

return shifted

完成一些的代码:

import cv2

import numpy as np

img = cv2.imread('cat.png')

def translate(image, x, y):

M = np.float32([[1, 0, x], [0, 1, y]])

shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

return shifted

shifted = translate(img, 10, 30)

cv2.imwrite('shift_right_10_down_30.png', shifted)

处理结果同上。。。

图像旋转

利用getRotationMatrix2D实现旋转

opencv中getRotationMatrix2D函数可以直接帮我们生成M 而不需要我们在程序里计算三角函数:

getRotationMatrix2D(center, angle, scale)

参数解析center 旋转中心点 (cx, cy) 你可以随意指定

angle 旋转的角度 单位是角度 逆时针方向为正方向 , 角度为正值代表逆时针

scale 缩放倍数. 值等于1.0代表尺寸不变

该函数返回的就是仿射变换矩阵M

示例代码

import cv2

import numpy as np

# 获取旋转矩阵

rotateMatrix = cv2.getRotationMatrix2D((100, 200), 90, 1.0)

#设置numpy矩阵的打印格式

np.set_printoptions(precision=2,suppress=True)

print(rotateMatrix)

OUTPUT

[[ 0. 1. -100.]

[ -1. 0. 300.]]

为了使用方便, 你也可以封装一下旋转过程

def rotate(image, angle, center = None, scale = 1.0):

(h, w) = image.shape[:2]

if center is None:

center = (w / 2, h / 2)

M = cv2.getRotationMatrix2D(center, angle, scale)

rotated = cv2.warpAffine(image, M, (w, h))

return rotated

演示代码

# -*- coding: utf-8 -*-

'''

围绕原点处旋转 (图片左上角) 正方向为逆时针

利用getRotationMatrix2D函数生成仿射矩阵

'''

import numpy as np

import cv2

from math import cos,sin,radians

from matplotlib import pyplot as plt

img = cv2.imread('lena1.jpg')

height, width, channel = img.shape

# 求得图片中心点, 作为旋转的轴心

cx = int(width / 2)

cy = int(height / 2)

# 旋转的中心

center = (cx, cy)

new_dim = (width, height)

# 进行2D 仿射变换

# 围绕原点 逆时针旋转30度

M = cv2.getRotationMatrix2D(center=center,angle=30, scale=1.0)

rotated_30 = cv2.warpAffine(img, M, new_dim)

# 围绕原点 逆时针旋转30度

M = cv2.getRotationMatrix2D(center=center,angle=45, scale=1.0)

rotated_45 = cv2.warpAffine(img, M, new_dim)

# 围绕原点 逆时针旋转30度

M = cv2.getRotationMatrix2D(center=center,angle=60, scale=1.0)

rotated_60 = cv2.warpAffine(img, M, new_dim)

plt.subplot(221)

plt.title("Src Image")

plt.imshow(img[:,:,::-1])

plt.subplot(222)

plt.title("Rotated 30 Degree")

plt.imshow(rotated_30[:,:,::-1])

plt.subplot(223)

plt.title("Rotated 45 Degree")

plt.imshow(rotated_45[:,:,::-1])

plt.subplot(224)

plt.title("Rotated 60 Degree")

plt.imshow(rotated_60[:,:,::-1])

plt.show()

原始图形:

图像旋转图像(逆时针30度、45度、60度):

利用wrapAffine实现缩放

数学原理推导

围绕原点进行旋转

由此我们得出

所以对应的变换矩阵为

注意,这里我们进行公式推导的时候,参照的原点是在左下角, 而在OpenCV中图像的原点在图像的左上角, 所以我们在代码里面对theta取反。

我们可以利用math包中的三角函数。但是有一点需要注意 :三角函数输入的角度是弧度制而不是角度制。

我们需要使用radians(x) 函数, 将角度转变为弧度。

import math

math.radians(180)

3.141592653589793

代码演示

# -*- coding: utf-8 -*-

'''

围绕原点处旋转 (图片左上角) 正方向为逆时针

'''

import numpy as np

import cv2

import math

from matplotlib import pyplot as plt

img = cv2.imread('lena1.jpg')

height, width, channel = img.shape

def getRotationMatrix2D(theta):

# 角度值转换为弧度值

# 因为图像的左上角是原点 需要×-1

theta = math.radians(-1*theta)

M = np.float32([

[math.cos(theta), -math.sin(theta), 0],

[math.sin(theta), math.cos(theta), 0]])

return M

# 进行2D 仿射变换

# 围绕原点 顺时针旋转30度

M = getRotationMatrix2D(30)

rotated_30 = cv2.warpAffine(img, M, (width, height))

# 围绕原点 顺时针旋转45度

M = getRotationMatrix2D(45)

rotated_45 = cv2.warpAffine(img, M, (width, height))

# 围绕原点 顺时针旋转60度

M = getRotationMatrix2D(60)

rotated_60 = cv2.warpAffine(img, M, (width, height))

plt.subplot(221)

plt.title("Src Image")

plt.imshow(img[:,:,::-1])

plt.subplot(222)

plt.title("Rotated 30 Degree")

plt.imshow(rotated_30[:,:,::-1])

plt.subplot(223)

plt.title("Rotated 45 Degree")

plt.imshow(rotated_45[:,:,::-1])

plt.subplot(224)

plt.title("Rotated 60 Degree")

plt.imshow(rotated_60[:,:,::-1])

plt.show()

原始图像:

旋转之后演示图:

围绕任意点进行旋转

数学原理推导

那么如何围绕任意点进行旋转呢?

可以先把当前的旋转中心点平移到原点处, 在原点处旋转后再平移回去。

假定旋转中心为 (cx,cy)

其中

所以

代码演示

# -*- coding: utf-8 -*-

'''

围绕画面中的任意一点旋转

'''

import numpy as np

import cv2

from math import cos,sin,radians

from matplotlib import pyplot as plt

img = cv2.imread('lena1.jpg')

height, width, channel = img.shape

theta = 45

def getRotationMatrix2D(theta, cx=0, cy=0):

# 角度值转换为弧度值

# 因为图像的左上角是原点 需要×-1

theta = radians(-1 * theta)

M = np.float32([

[cos(theta), -sin(theta), (1-cos(theta))*cx + sin(theta)*cy],

[sin(theta), cos(theta), -sin(theta)*cx + (1-cos(theta))*cy]])

return M

# 求得图片中心点, 作为旋转的轴心

cx = int(width / 2)

cy = int(height / 2)

# 进行2D 仿射变换

# 围绕原点 逆时针旋转30度

M = getRotationMatrix2D(30, cx=cx, cy=cy)

rotated_30 = cv2.warpAffine(img, M, (width, height))

# 围绕原点 逆时针旋转45度

M = getRotationMatrix2D(45, cx=cx, cy=cy)

rotated_45 = cv2.warpAffine(img, M, (width, height))

# 围绕原点 逆时针旋转60度

M = getRotationMatrix2D(60, cx=cx, cy=cy)

rotated_60 = cv2.warpAffine(img, M, (width, height))

plt.subplot(221)

plt.title("Src Image")

plt.imshow(img[:,:,::-1])

plt.subplot(222)

plt.title("Rotated 30 Degree")

plt.imshow(rotated_30[:,:,::-1])

plt.subplot(223)

plt.title("Rotated 45 Degree")

plt.imshow(rotated_45[:,:,::-1])

plt.subplot(224)

plt.title("Rotated 60 Degree")

plt.imshow(rotated_60[:,:,::-1])

plt.show()

旋转效果:

围绕图片中心点旋转30度至60度

图像缩放

利用resize函数实现缩放

opencv其实有专门进行图像缩放的函数resize。

resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) -> dst

参数解析src 输入图片

dsize 输出图片的尺寸

dst 输出图片

fx x轴的缩放因子

fy y轴的缩放因子

interpolation 插值方式

INTER_NEAREST - 最近邻插值

INTER_LINEAR - 线性插值(默认)

INTER_AREA - 区域插值

INTER_CUBIC - 三次样条插值

INTER_LANCZOS4 - Lanczos插值

在使用的时候, 我们可以传入指定的图片的尺寸dsize

'''

使用resize函数对图像进行缩放

'''

import cv2

import numpy as np

img = cv2.imread('lena1.jpg')

height,width,channel = img.shape

# 声明新的维度

new_dimension = (400, 400)

# 指定新图片的维度与插值算法(interpolation)

resized = cv2.resize(img, new_dimension)

cv2.imwrite('lena_resize_400_400.png', resized)

原始图像:

缩放后的图像:

或者指定缩放因子fx,fy

将dsize 设置为 None, 然后指定fx fy

import cv2

import numpy as np

img = cv2.imread('lena1.jpg')

height,width,channel = img.shape

# 指定新图片的维度与插值算法(interpolation)

resized = cv2.resize(img, None, fx=1.5, fy=2)

cv2.imwrite('lena_resize_fx_fy.jpg', resized)

运行结果如下:

或者指定输出图片,并传入输出图片的size:

'''

根据fx跟fy进行图像缩放

'''

import cv2

import numpy as np

img = cv2.imread('lena1.jpg')

height,width,channel = img.shape

# 指定输出图片

dst = np.zeros((100, 100, 3), dtype='uint8')

# 指定新图片的维度与插值算法(interpolation)

cv2.resize(img, dst=dst, dsize=(dst.shape[1], dst.shape[0]), fx=1.5, fy=2)

cv2.imwrite('lena_resize_from_dst.jpg', dst)

运行结果如下:

为了方便使用, 我们也可以将其封装成函数

def resize(image, width = None, height = None, inter = cv2.INTER_AREA):

dim = None

(h, w) = image.shape[:2]

if width is None and height is None:

return image

if width is None:

r = height / float(h)

dim = (int(w * r), height)

if height is None:

r = width / float(w)

dim = (width, int(h * r))

if width and height:

dim = (width, height)

resized = cv2.resize(image, dim, interpolation = inter)

return resized

分辨率 从 5 * 5 放大到 1000 * 1000, 选择不同的插值算法,对应的演示效果:

'''

差值算法对比

'''

import cv2

import numpy as np

from matplotlib import pyplot as plt

img = np.uint8(np.random.randint(0,255,size=(5,5)))

height,width= img.shape

# 声明新的维度

new_dimension = (1000, 1000)

plt.subplot(231)

plt.title("SRC Image")

plt.imshow(img,cmap='seismic')

plt.subplot(232)

resized = cv2.resize(img, new_dimension, interpolation = cv2.INTER_NEAREST)

plt.title("INTER_NEAREST")

plt.imshow(resized,cmap='seismic')

plt.subplot(233)

resized = cv2.resize(img, new_dimension, interpolation = cv2.INTER_LINEAR)

plt.title("INTER_LINEAR")

plt.imshow(resized,cmap='seismic')

plt.subplot(234)

resized = cv2.resize(img, new_dimension, interpolation = cv2.INTER_AREA)

plt.title("INTER_AREA")

plt.imshow(resized,cmap='seismic')

plt.subplot(235)

resized = cv2.resize(img, new_dimension, interpolation = cv2.INTER_CUBIC)

plt.title("INTER_CUBIC")

plt.imshow(resized,cmap='seismic')

plt.subplot(236)

resized = cv2.resize(img, new_dimension, interpolation = cv2.INTER_LANCZOS4)

plt.title("INTER_LANCZOS4")

plt.imshow(resized,cmap='seismic')

plt.show()

利用wrapAffine实现缩放

数学原理

对图像的伸缩变换的变换矩阵M为

其中,

fx:代表x轴的焦距(缩放因子)

fy:代表y轴的焦距(缩放因子)

则可以得出以下式子:

具体代码演示

源代码:

'''

使用仿射矩阵实现

'''

import numpy as np

import cv2

img = cv2.imread('lena1.jpg')

height,width,channel = img.shape

# x轴焦距 1.5倍

fx = 1.5

# y轴焦距 2倍

fy = 2

# 声明变换矩阵 向右平移10个像素, 向下平移30个像素

M = np.float32([[fx, 0, 0], [0, fy, 0]])

# 进行2D 仿射变换

resized = cv2.warpAffine(img, M, (int(width*fx), int(height*fy)))

cv2.imwrite('resize_raw.jpg', resized)

运行效果:

原始图像:

我们利用random 模块生成一个5×5的随机矩阵。

# 生成一个随机噪点

img = np.uint8(np.random.randint(0,255,size=(5,5)))

源代码:

'''

仿射矩阵实现缩放 fx,fy

'''

import numpy as np

import cv2

from matplotlib import pyplot as plt

# 生成一个随机噪点

img = np.uint8(np.random.randint(0,255,size=(5,5)))

height,width = img.shape

# x轴焦距 1.5倍

fx = 1.5

# y轴焦距 2倍

fy = 2

# 声明变换矩阵 向右平移10个像素, 向下平移30个像素

M = np.float32([[fx, 0, 0], [0, fy, 0]])

# 进行2D 仿射变换

resized = cv2.warpAffine(img, M, (int(width*fx), int(height*fy)))

print(img)

print(resized)

# 数据可视化

plt.subplot(121)

plt.imshow(img, cmap="gray")

plt.subplot(122)

plt.imshow(resized,cmap="gray")

plt.show()

原图:

[[224 25 25 165 16]

[ 37 170 114 16 101]

[181 5 7 94 41]

[206 167 23 133 115]

[217 115 154 97 65]]

缩放后:

[[224 93 25 25 117 114 16]

[131 109 88 70 83 80 59]

[ 37 124 151 114 50 45 101]

[109 95 78 61 57 61 71]

[181 66 6 7 64 76 41]

[194 123 62 15 80 101 78]

[206 180 118 23 95 127 115]

[212 165 123 89 106 106 90]

[217 150 128 154 117 86 65]

[109 75 64 77 58 43 33]]

为了更加直观的感受, 我们可以进行数据可视化。

我们使用matplotlib进行绘制 resize前与resize之后的图片。

图像翻转

使用flip函数实现翻转

flip 函数原型

flip(src, flipCode[, dst]) -> dst

参数解析src 输入图片

flipCode 翻转代码

1 水平翻转 Horizontally (图片第二维度是column)

0 垂直翻转 *Vertically * (图片第一维是row)

-1 同时水平翻转与垂直反转 Horizontally & Vertically

为了方便使用, 你也可以封装成下面的函数

def flip(image, direction):

if direction == "h":

flipped = cv2.flip(image, 1)

elif direction == "v":

flipped = cv2.flip(image, 0)

else:

# both horizontally and vertically

flipped = cv2.flip(image, -1)

具体源码及效果展示

'''

反转Demo

'''

import numpy as np

import cv2

from matplotlib import pyplot as plt

img = cv2.imread('lena1.jpg')

def bgr2rbg(img):

'''

将颜色空间从BGR转换为RBG

'''

return img[:,:,::-1]

# 水平翻转

flip_h = cv2.flip(img, 1)

# 垂直翻转

flip_v = cv2.flip(img, 0)

# 同时水平翻转与垂直翻转

flip_hv = cv2.flip(img, -1)

plt.subplot(221)

plt.title('SRC')

plt.imshow(bgr2rbg(img))

plt.subplot(222)

plt.title('Horizontally')

plt.imshow(bgr2rbg(flip_h))

plt.subplot(223)

plt.title('Vertically')

plt.imshow(bgr2rbg(flip_v))

plt.subplot(224)

plt.title('Horizontally & Vertically')

plt.imshow(bgr2rbg(flip_hv))

plt.show()

利用numpy的索引实现翻转

利用numpy中ndarray的索引, 我们可以非常方便地实现图像翻转。

# 水平翻转

flip_h = img[:,::-1]

# 垂直翻转

flip_v = img[::-1]

# 水平垂直同时翻转

flip_hv = img[::-1, ::-1]

具体源码及效果展示

'''

使用numpy的索引进行图像反转

'''

import cv2

import numpy as np

from matplotlib import pyplot as plt

img = cv2.imread('lena1.jpg')

height,width,channel = img.shape

# 水平翻转

flip_h = img[:,::-1]

# 垂直翻转

flip_v = img[::-1]

# 水平垂直同时翻转

flip_hv = img[::-1, ::-1]

def bgr2rbg(img):

'''

将颜色空间从BGR转换为RBG

'''

return img[:,:,::-1]

plt.subplot(221)

plt.title('SRC')

plt.imshow(bgr2rbg(img))

plt.subplot(222)

plt.title('Horizontally')

plt.imshow(bgr2rbg(flip_h))

plt.subplot(223)

plt.title('Vertically')

plt.imshow(bgr2rbg(flip_v))

plt.subplot(224)

plt.title('Horizontally & Vertically')

plt.imshow(bgr2rbg(flip_hv))

plt.show()

利用wrapAffine实现翻转

图像翻转的数学原理注: width 代表图像的宽度; height代表图像的高度

水平翻转的变换矩阵

垂直翻转的变换矩阵

同时进行水平翻转与垂直翻转

具体源码及效果展示

'''

使用仿射矩阵实现反转

'''

import cv2

import numpy as np

from matplotlib import pyplot as plt

img = cv2.imread('lena1.jpg')

height,width,channel = img.shape

# 水平翻转

M1 = np.float32([[-1, 0, width], [0, 1, 0]])

flip_h = cv2.warpAffine(img, M1, (width, height))

# 垂直翻转

M2 = np.float32([[1, 0, 0], [0, -1, height]])

flip_v = cv2.warpAffine(img, M2, (width, height))

# 水平垂直同时翻转

M3 = np.float32([[-1, 0, width], [0, -1, height]])

flip_hv = cv2.warpAffine(img, M3, (width, height))

def bgr2rbg(img):

'''

将颜色空间从BGR转换为RBG

'''

return img[:,:,::-1]

plt.subplot(221)

plt.title('SRC')

plt.imshow(bgr2rbg(img))

plt.subplot(222)

plt.title('Horizontally')

plt.imshow(bgr2rbg(flip_h))

plt.subplot(223)

plt.title('Vertically')

plt.imshow(bgr2rbg(flip_v))

plt.subplot(224)

plt.title('Horizontally & Vertically')

plt.imshow(bgr2rbg(flip_hv))

plt.show()

「❤️ 感谢大家」点赞支持下吧,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-)

欢迎在留言区与我分享你的想法,也欢迎你在留言区记录你的思考过程。

python如何移动图片_python之详细图像仿射变换讲解(图像平移、旋转、缩放、翻转),一文就够了,赶紧码住...相关推荐

  1. python用户界面导入图片_python学习笔记之11:图像用户界面

    这里会介绍如何创建python程序的图像用户界面(GUI),也就是那些带有按钮和文本框的窗口等.目前支持python的所谓"GUI工具包"的有很多,本文简要介绍最成熟的跨平台pyt ...

  2. [Python图像处理] 十二.图像几何变换之图像仿射变换、图像透视变换和图像校正

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  3. python excel 打印文档_教你如何用Python轻轻松松操作Excel、Word、CSV,一文就够了,赶紧码住!!!...

    原标题:教你如何用Python轻轻松松操作Excel.Word.CSV,一文就够了,赶紧码住!!! 作者:奈何缘浅wyj Python 操作 Excel 常用工具 数据处理是 Python 的一大应用 ...

  4. 图片(旋转/缩放/翻转)变换效果(ccs3/滤镜/canvas)

    以前要实现图片的旋转或翻转,只能用ie的滤镜来实现,虽然canvas也实现,但ie不支持而且不是html标准. css3出来后,终于可以用标准的transform来实现变换,而canvas也已成为ht ...

  5. python常用函数图片_Python图像,图片处理笔记

    1.python3已经用Pillow代替PIL,文件要close,图像要save 2.Image是PIL图像处理中的模块 from PIL import Image 2.1 Image.open() ...

  6. python如何训练图片_Python练习第一题,在图片上加入数字

    题目:在头像(QQ.微信等)右上角加上红色的数字,类似于微信未读信息数量那种提示效果. 下面是示例,在图片上加数字. 用PS很简单就可以做到,但是如何用Python完成呢? 一.思路:利用Python ...

  7. python生成字母图片_Python 模拟动态产生字母验证码图片功能

    模拟动态产生字母验证码图片 模拟生成验证码,首先要做的是生成随机的字母,然后对字母进行模糊处理.这里介绍一下 Python 提供的 Pillow 模块. Pillow PIL:Python Image ...

  8. 如何使用python批量压缩图片_python利用Guetzli批量压缩图片

    Google 又开源了,这次开源了一款图像算法工具 Guetzli.Guetzli,在瑞士德语中是"cookie(曲奇)"的意思,是一个针对数码图像和网页图像的 JPEG 编码器, ...

  9. python显示gif图片_Python给gif图片加文字水印

    为了成批地给图像增加水印,我们这里用到了枕头模块.它的英文名为pillow.安装它的方式为用cmd命令打开DOS提示符窗口,然后输入pip install pillow即可.就像下面这样: pytho ...

最新文章

  1. mongodb 安装部署说明
  2. 香!用一行命令实现文本检索电脑图片|教程
  3. java util concurrent_Error: java.util.concurrent.Execution
  4. 使用经过oauth验证后的github API,避免调用频次超标的问题
  5. 等待的操作过时_不会过时的6种网站seo优化操作
  6. JDK源码解析之 Java.lang.Enum
  7. 执行quartz报错java.lang.NoClassDefFoundError: javax/transaction/UserTransaction
  8. 基于Verilog的贪吃蛇小游戏设计(附代码)
  9. SVN下载 1.11.0版本 win7 32位 安装文件及中文语言包
  10. Outlook邮箱注册详解教程
  11. 2019年全面加强知识产权保护工作最新进展及下一步工作
  12. android 控件发光_Android自定义控件打造闪闪发光字体
  13. 爬取徐州市自然资源和规划局土地数据
  14. 【语音控制】0成本实现小爱远程开关电脑
  15. 关于centos安装最新的firefox出现的问题GLib-GObject-CRITICAL **
  16. let const var 区别详解
  17. 电商平台-安全设计与架构
  18. 致敬全球第一CEO杰克·韦尔奇,重温其卸任演讲
  19. NGR-PEG-6-FAM 肿瘤新生血管靶向肽NGR-聚乙二醇-6-羧甲基荧光素
  20. 湖北省2020计算机技能大赛,【2018省赛专题报道】计算机信息技术学院在2018年湖北省职业技能大赛“计算机网络与信息安全技术”赛项中获奖...

热门文章

  1. Web中的鼠标自动移动
  2. UML、XML、WebService,NUnit单元测试,测试驱动开发,httphandl,httpmodel
  3. 一段按页自动滚动文字或图片的Js代码
  4. DM入门之Apriori小结
  5. java short后缀_自学java的新手问个问题,为什么写个代码中的int能自动转
  6. mysql sum_MySQL中的SUM函数使用教程
  7. vue省市区三级联动mysql,js/json,html/jsp
  8. Android 人脸实名验证demo——腾讯人脸核身·云智慧眼
  9. fragment 调用activity方法,如dispatchKeyEvent,dispatchTouchEvent
  10. 施乐700彩机服务器显示c4,施乐彩色数码复印机故障代码大全