python cv2 获取矩形,居中,旋转

下面的代码可以让一个图片中的任意位置,角度的矩形,旋转到正确的位置,并且居中显示。
import cv2
import numpy as np
import matplotlib.pyplot as plt
from pynput import keyboard,mouse

def plt_show(image):
plt.imshow(image)
plt.axis('off')
plt.show()

def show(image):
cv2.imshow("raw", image)
cv2.waitKey(0)

def move_right():
print("moving right")

def move_left():
print("moving left")

def move_up():
print("moving up")

def move_down():
print("moving down")

def save_picture(angel,image):
cv2.imwrite("%s/%s.jpg" % ('image', angel),image.shape[0],image.shape[1])

def handlToGray(image):
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret, TRE = cv2.threshold(gray, 50, 255, cv2.THRESH_BINARY) # 图像二值化
return TRE
#图像转动一定角度
def rotate_bound(image, angle):
# grab the dimensions of the image and then determine the
# center
(h, w) = image.shape[:2]
(cX, cY) = (w // 2, h // 2)

# grab the rotation matrix (applying the negative of the
# angle to rotate clockwise), then grab the sine and cosine
# (i.e., the rotation components of the matrix)
M = cv2.getRotationMatrix2D((cX, cY), -angle, 1.0)
cos = np.abs(M[0, 0])
sin = np.abs(M[0, 1])

# compute the new bounding dimensions of the image
nW = int((h * sin) + (w * cos))
nH = int((h * cos) + (w * sin))

# adjust the rotation matrix to take into account translation
M[0, 2] += (nW / 2) - cX
M[1, 2] += (nH / 2) - cY

# perform the actual rotation and return the image
return cv2.warpAffine(image, M, (nW, nH))
#图像按照给定的x,y 值进行平移
def moving_bound(image,x,y):
(h, w) = image.shape[:2]
M = np.float32([[1,0,-x],[0,1,-y]])
return cv2.warpAffine(image, M, (w, h))
#找到矩形的旋转角度
def find_rect(image):
gray = handlToGray(image)
contours, hierarchy = cv2.findContours(gray, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
rect = cv2.minAreaRect(contours[0])
return rect


#获取矩形的偏移坐标
def getoffset(image):
(h, w) = image.shape[:2]
cx = int(w / 2)
cy = int(h / 2)
x_left = 0;
x_right = 0;
y_up = 0;
y_down = 0;

x_total = 0;
y_total = 0;

# 获取左边边框
for i in range(cx, 0, -1):
mx = image[cy][i] # 先取高度,再取宽度
if (mx == 0):
x_left = i
break
# 获取右边边框
for i in range(cx, w, 1):
mx = image[cy][i]
if (mx == 0):
x_right = i
break
x_total = x_right - x_left

# 获取上边框
for i in range(cy, 0, -1):
my = image[i][cx]
if (my == 0):
y_up = i
break
# 获取下边框
for i in range(cy, h, 1):
mx = image[i][cx]
if (mx == 0):
y_down = i
break
y_total = y_down - y_up

x_offset = (x_left + x_total / 2) - cx
y_offset = (y_up + y_total / 2) - cy

return x_offset, y_offset, x_total, y_total



def on_press(key):
pass

def on_release(key):
if key == keyboard.Key.esc: # Stop listener
return False
elif key == keyboard.Key.right:
move_right()
elif key == keyboard.Key.left:
move_left()
elif key == keyboard.Key.up:
move_up()
elif key == keyboard.Key.down:
move_down()



def on_move(x, y):
pass

def on_click(x, y, button, pressed):
pass

def on_scroll(x, y, dx, dy):
pass

def main():

image = cv2.imread("image/raw2.jpg")
rect = find_rect(image)
angle = rect[2] #角度
im = rotate_bound(image, -angle)
rect = find_rect(im)
print(rect)
x,y = rect[0]
width, height = rect[1]
box = cv2.boxPoints(rect)
(h, w) = im.shape[:2]
cx = int(w / 2)
cy = int(h / 2)
im = moving_bound(im,x-cx,y-cy)
if width < height:
im = rotate_bound(im, 90)
TRE = handlToGray(im)
plt_show(TRE)

main()

# Collect events until released
keyboard_listener = keyboard.Listener(on_press=on_press, on_release=on_release)
mouse_listener = mouse.Listener(on_click=on_click, on_move=on_move, on_scroll=on_scroll)
lst = [keyboard_listener, mouse_listener]

for t in lst: t.start()
for t in lst: t.join()




Python+树莓派+YOLO打造一款人工智能相机

不久之前,亚马逊刚刚推出了DeepLens。这是一款专门面向开发人员的全球首个支持深度学习的摄像机,它所使用的机器学习算法不仅可以检测物体活动和面部表情,而且还可以检测类似弹吉他等复杂的活动。虽然DeepLens还未正式上市,但智能摄像机的概念已经诞生了。

Python+树莓派+YOLO打造一款人工智能相机

今天,我们将自己动手打造出一款基于深度学习的照相机,当小鸟出现在摄像头画面中时,它将能检测到小鸟并自动进行拍照。最终成品所拍摄的画面如下所示:

Python+树莓派+YOLO打造一款人工智能相机

相机不傻,它可以很机智

我们不打算将一个深度学习模块整合到相机中,相反,我们准备将树莓派“挂钩”到摄像头上,然后通过WiFi来发送照片。本着“一切从简”(穷)为核心出发,我们今天只打算搞一个跟DeepLens类似的概念原型,感兴趣的同学可以自己动手尝试一下。

接下来,我们将使用Python编写一个Web服务器,树莓派将使用这个Web服务器来向计算机发送照片,或进行行为推断和图像检测。

Python+树莓派+YOLO打造一款人工智能相机

我们这里所使用的计算机其处理能力会更强,它会使用一种名叫YOLO的神经网络架构来检测输入的图像画面,并判断小鸟是否出现在了摄像头画面内。

我们得先从YOLO架构开始,因为它是目前速度最快的检测模型之一。该模型专门给Tensorflow(谷歌基于DistBelief进行研发的第二代人工智能学习系统)留了一个接口,所以我们可以轻松地在不同的平台上安装和运行这个模型。友情提示,如果你使用的是我们本文所使用的迷你模型,你还可以用CPU来进行检测,而不只是依赖于价格昂贵的GPU。

接下来回到我们的概念原型上… 如果像框内检测到了小鸟,那我们就保存图片并进行下一步分析。

检测与拍照

Python+树莓派+YOLO打造一款人工智能相机

正如我们所说的,DeepLens的拍照功能是整合在计算机里的,所以它可以直接使用板载计算能力来进行基准检测,并确定图像是否符合我们的标准。

但是像树莓派这样的东西,我们其实并不需要使用它的计算能力来进行实时计算。因此,我们准备使用另一台计算机来推断出现在图像中的内容。

我使用的是一台简单的Linux计算机,它带有一个摄像头以及WiFi无线网卡(树莓派3+摄像头),而这个简单的设备将作为我的深度学习机器并进行图像推断。对我来说,这是目前最理想的解决方案了,这不仅大大缩减了我的成本,而且还可以让我在台式机上完成所有的计算。

当然了,如果你不想使用树莓派视频照相机的话,你也可以选择在树莓派上安装OpenCV 3来作为方案B,具体的安装方法请参考【这份文档】。友情提示,安装过程可谓是非常的麻烦!

接下来,我们需要使用Flask来搭建Web服务器,这样我们就可以从摄像头那里获取图像了。这里我使用了MiguelGrinberg所开发的网络摄像头服务器代码(Flask视频流框架),并创建了一个简单的jpg终端:

 

#!/usr/bin/envpythonfrom import lib import import_moduleimport osfrom flask import Flask, render_template, Response

#uncomment below to use Raspberry Pi camera instead#from camera_pi import Camera #comment this out if you’re not using USB webcamfrom camera_opencv import Camera

 

app =Flask(__name__)

@app.route(‘/’)def index():    return “hello world!” def gen2(camera):    “””Returns a single imageframe”””    frame = camera.get_frame()

yield frame

@app.route(‘/image.jpg’)def image():    “””Returns a single currentimage for the webcam”””    return Response(gen2(Camera()),mimetype=’image/jpeg’)

if __name__ == ‘__main__’:

app.run(host=’0.0.0.0′, threaded=True)

 

如果你使用的是树莓派视频照相机,请确保没有注释掉上述代码中from camera_pi那一行,然后注释掉from camera_opencv那一行。

你可以直接使用命令python3 app.py或gunicorn来运行服务器,这跟Miguel在文档中写的方法是一样的。如果我们使用了多台计算机来进行图像推断的话,我们还可以利用Miguel所开发的摄像头管理方案来管理摄像头以及计算线程。

当我们启动了树莓派之后,首先需要根据IP地址来判断服务器是否正常工作,然后尝试通过Web浏览器来访问服务器。

 

URL地址格式类似如下:

http://192.168.1.4:5000/image.jpg

 

在树莓派中加载Web页面及图像来确定服务器是否正常工作:

Python+树莓派+YOLO打造一款人工智能相机

图像导入及推断

既然我们已经设置好了终端来加载摄像头当前的图像内容,我们就可以构建一个脚本来捕捉图像并推断图像中的内容了。

这里我们需要用到request库(一个优秀的Python库,用于从URL地址获取文件资源)以及Darkflow(YOLO模型基于Tensorflow的实现)。

不幸的是,我们没办法使用pip之类的方法来安装Darkflow,所以我们需要克隆整个代码库,然后自己动手完成项目的构建和安装。安装好Darkflow项目之后,我们还需要下载一个YOLO模型。

因为我使用的是速度比较慢的计算机和板载CPU(而不是速度较快的GPU),所以我选择使用YOLO v2迷你网络。当然了,它的功能肯定没有完整的YOLO v2模型的推断准确性高啦!

配置完成之后,我们还需要在计算机中安装Pillow、numpy和OpenCV。最后,我们就可以彻底完成我们的代码,并进行图像检测了。

最终的代码如下所示:

 

from darkflow.net.build import TFNetimport cv2

from io import BytesIOimport timeimport requestsfrom PIL import Imageimport numpy as np

 

options= {“model”: “cfg/tiny-yolo-voc.cfg”, “load”:”bin/tiny-yolo-voc.weights”, “threshold”: 0.1}

 

tfnet= TFNet(options)

 

birdsSeen= 0def handleBird():    pass

whileTrue:

r =requests.get(‘http://192.168.1.11:5000/image.jpg’) # a bird yo    curr_img = Image.open(BytesIO(r.content))

curr_img_cv2 =cv2.cvtColor(np.array(curr_img), cv2.COLOR_RGB2BGR)

 

result = tfnet.return_predict(curr_img_cv2)

print(result)

for detection in result:

if detection[‘label’] == ‘bird’:

print(“bird detected”)

birdsSeen += 1            curr_img.save(‘birds/%i.jpg’ %birdsSeen)

print(‘running again’)

time.sleep(4)

 

此时,我们不仅可以在命令控制台中查看到树莓派所检测到的内容,而且我们还可以直接在硬盘中查看保存下来的小鸟照片。接下来,我们就可以使用YOLO来标记图片中的小鸟了。

假阳性跟假阴性之间的平衡

我们在代码的options字典中设置了一个threshold键,这个阈值代表的是我们用于检测图像的某种成功率。在测试过程中,我们将其设为了0.1,但是如此低的阈值会给我们带来是更高的假阳性以及误报率。更糟的是,我们所使用的迷你YOLO模型准确率跟完整的YOLO模型相比,差得太多了,但这也是需要考虑的一个平衡因素。

降低阈值意味着我们可以得到更多的模型输出(照片),在我的测试环境中,我阈值设置的比较低,因为我想得到更多的小鸟照片,不过大家可以根据自己的需要来调整阈值参数。

代码开源

跟之前一样,我已经将所有的代码上传到GitHub上了,感兴趣的同学可以自行下载安装【GitHub传送门】。

* 参考来源:makeartwithpython,FB 小编 Alpha_h4ck 编译,转载请注明来自 FreeBuf.COM

Python3 实例

Python3 实例

以下实例在 Python3.4.3 版本下测试通过:

  • Python Hello World 实例
  • Python 数字求和
  • Python 平方根
  • Python 二次方程
  • Python 计算三角形的面积
  • Python 随机数生成
  • Python 摄氏温度转华氏温度
  • Python 交换变量
  • Python if 语句
  • Python 判断字符串是否为数字
  • Python 判断奇数偶数
  • Python 判断闰年
  • Python 获取最大值函数
  • Python 质数判断
  • Python 阶乘实例
  • Python 九九乘法表
  • Python 斐波那契数列
  • Python 阿姆斯特朗数
  • Python 十进制转二进制、八进制、十六进制
  • Python ASCII码与字符相互转换
  • Python 最大公约数算法
  • Python 最小公倍数算法
  • Python 简单计算器实现
  • Python 生成日历
  • Python 使用递归斐波那契数列
  • Python 文件 IO
  • Python 字符串判断
  • Python 字符串大小写转换
  • Python 计算每个月天数
  • Python 获取昨天日期
  • Python list 常用操作

Python list 常用操作

Python list 常用操作

Python list 常用操作 Python3 实例

1.list 定义

 
>>>li = ["a", "b", "mpilgrim", "z", "example"] 
>>>li ['a', 'b', 'mpilgrim', 'z', 'example'] 
>>>li[1]
 
    'b'

1.list 负数索引

 
>>>li  ['a', 'b', 'mpilgrim', 'z', 'example'] 
>>>li[-1]  'example'
>>>li[-3]  'mpilgrim'
>>>li  ['a', 'b', 'mpilgrim', 'z', 'example'] 
>>>li[1:3]   ['b', 'mpilgrim']  
>>>li[1:-1]  ['b', 'mpilgrim', 'z']  
>>>li[0:3]   ['a', 'b', 'mpilgrim']  

3.list 增加元素

 
>>>li  ['a', 'b', 'mpilgrim', 'z', 'example'] 
>>>li.append("new") 
>>>li  ['a', 'b', 'mpilgrim', 'z', 'example', 'new'] 
>>>li.insert(2, "new") 
>>>li  ['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new'] 
>>>li.extend(["two", "elements"])  
>>>li  ['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', 'two', 'elements'] 

4.list 搜索

 
>>>li  ['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', 'two', 'elements'] 
>>>li.index("example") 5 
>>>li.index("new") 2 
>>>li.index("c") Traceback (innermost last):  File "<interactive input>", line 1, in ? ValueError: list.index(x): x not in list 
>>>"c" in li False 

5.list 删除元素

 
>>>li  ['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', 'two', 'elements'] 
>>>li.remove("z")   
>>>li  ['a', 'b', 'new', 'mpilgrim', 'example', 'new', 'two', 'elements'] 
>>>li.remove("new")
   
# 删除首次出现的一个值 
>>>li  ['a', 'b', 'mpilgrim', 'example', 'new', 'two', 'elements']
   
# 第二个 'new'未删除 
>>>li.remove("c")
    
#list 中没有找到值, Python 会引发一个异常 Traceback (innermost last):   File "<interactive input>", line 1, in ?  ValueError: list.remove(x): x not in list 
>>>li.pop()
     
# pop 会做两件事: 删除 list 的最后一个元素, 然后返回删除元素的值。 'elements'
>>>li  ['a', 'b', 'mpilgrim', 'example', 'new', 'two'] 

6.list 运算符

 
>>>li = ['a', 'b', 'mpilgrim'] 
>>>li = li + ['example', 'new'] 
>>>li  ['a', 'b', 'mpilgrim', 'example', 'new'] 
>>>li += ['two'] 

 

 

 

 

 

 

 

 
>>>li  ['a', 'b', 'mpilgrim', 'example', 'new', 'two'] 
>>>li = [1, 2] * 3 
>>>li  [1, 2, 1, 2, 1, 2]  

7.使用join链接list成为字符串

 
>>>params ={"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"  } 
>>>["%s=%s" % (k, v) for k, v in params.items()] ['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret'] 
>>>";

".join(["%s=%s" % (k, v) for k, v in params.items()]) 'server=mpilgrim;

uid=sa;

database=master;

pwd=secret'

join 只能用于元素是字符串的 list;

它不进行任何的类型强制转换。连接一个存在一个或多个非字符串元素的 list 将引发一个异常。

8.list 分割字符串

 
>>>li = ['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret'] 
>>>s = ";

".join(li) 
>>>s  'server=mpilgrim;

uid=sa;

database=master;

pwd=secret'
>>>s.split(";

")
    ['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret'] 
>>>s.split(";

", 1)  ['server=mpilgrim', 'uid=sa;

database=master;

pwd=secret'] 

split 与 join 正好相反, 它将一个字符串分割成多元素 list。

注意, 分隔符 (“;

“) 被完全去掉了, 它没有在返回的 list 中的任意元素中出现。

split 接受一个可选的第二个参数, 它是要分割的次数。

9.list 的映射解析

 
>>>li = [1, 9, 8, 4]  
>>>[elem*2 for elem in li] 

 

 

 [2, 18, 16, 8]  
>>>li [1, 9, 8, 4]  
>>>li = [elem*2 for elem in li]  
>>>li  [2, 18, 16, 8]  

10.dictionary中的解析

 
>>>params ={"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"  } 
>>>params.keys() ['server', 'uid', 'database', 'pwd'] 
>>>params.values() ['mpilgrim', 'sa', 'master', 'secret'] 
>>>params.items() [('server', 'mpilgrim'), ('uid', 'sa'), ('database', 'master'), ('pwd', 'secret')] 
>>>[k for k, v in params.items()] ['server', 'uid', 'database', 'pwd'] 
>>>[v for k, v in params.items()] ['mpilgrim', 'sa', 'master', 'secret'] 
>>>["%s=%s" % (k, v) for k, v in params.items()] ['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret'] 

11.list 过滤

 
>>>li = ["a", "mpilgrim", "foo", "b", "c", "b", "d", "d"] 
>>>[elem for elem in li if len(elem) >1] ['mpilgrim', '
foo'] 
>>>[elem for elem in li if elem != "b"] ['a', 'mpilgrim', '
foo', 'c', 'd', 'd'] 
>>>[elem for elem in li if li.count(elem) == 1] ['a', 'mpilgrim', '
foo', 'c'] 

Python list 常用操作 Python3 实例

Python 获取昨天日期

Python 获取昨天日期

Python 获取昨天日期 Python3 实例
以下代码通过导入 datetime 模块来获取昨天的日期:


# Filename : test.py
  
# 引入 datetime 模块
import datetime def getYesterday():  	today=datetime.date.today()  	oneday=datetime.timedelta(days=1)  	yesterday=today-oneday   	
return yesterday 
# 输出
print(getYesterday())

执行以上代码输出结果为:

 2015-06-10

以上实例输出的意思为昨天的日期是 2015 年 6 月 10 日。
Python 获取昨天日期 Python3 实例

Python 计算每个月天数

Python 计算每个月天数

Python 计算每个月天数 Python3 实例

以下代码通过导入 calendar 模块来计算每个月的天数:


# Filename : test.py
 
import calendar monthRange = calendar.monthrange(2013,6)
print(monthRange) 

执行以上代码输出结果为:

 (5, 30) 

输出的是一个元组,第一个元素是所查月份的第一天对应的是星期几(0-6),第二个元素是这个月的天数。以上实例输出的意思为 2013 年 6 月份的第一天是星期六,该月总共有 30 天。

Python 计算每个月天数 Python3 实例

Python 字符串大小写转换

Python 字符串大小写转换

Python 字符串大小写转换 Python3 实例

以下代码演示了如何将字符串转换为大写字母,或者将字符串转为小写字母等:


# Filename : test.py
   str = "www.soxitoday.com"
print(str.upper())
 
   
# 把所有字符中的小写字母转换成大写字母
print(str.lower())
 
   
# 把所有字符中的大写字母转换成小写字母
print(str.capitalize())
    
# 把第一个字母转化为大写字母,其余小写
print(str.title())
 
   
# 把每个单词的第一个字母转化为大写,其余小写  

执行以上代码输出结果为:

WWWW.SOXITODAY.COM www.soxitoday.com Www.soxitoday.com Www.Soxitoday.Com 

Python 字符串大小写转换 Python3 实例

Python 字符串判断

Python 字符串判断

Python 字符串判断 Python3 实例

以下代码演示了Python字符串的判断:


# Filename : test.py
  
# 测试实例一
print("测试实例一") str = "w3cschool.cn"
print(str.isalnum())
# 判断所有字符都是数字或者字母
print(str.isalpha())
# 判断所有字符都是字母
print(str.isdigit())
# 判断所有字符都是数字
print(str.islower())
# 判断所有字符都是小写
print(str.isupper())
# 判断所有字符都是大写
print(str.istitle())
# 判断所有单词都是首字母大写,像标题
print(str.isspace())
# 判断所有字符都是空白字符、t、n、r
print("------------------------") 
# 测试实例二
print("测试实例二") str = "w3cschool"
print(str.isalnum())
print(str.isalpha())
print(str.isdigit())
print(str.islower())
print(str.isupper())
print(str.istitle())
print(str.isspace())  

执行以上代码输出结果为:

测试实例一 False False False True False False False ------------------------ 测试实例二 True False False True False False False 

Python 字符串判断 Python3 实例

Python 文件 IO

Python 文件 IO

Python 文件 IO Python3 实例

以下代码演示了Python基本的文件操作,包括 open,read,write:


# Filename : test.py
  
# 写文件 with open("test.txt", "wt") as out_file:
     out_file.write("该文本会写入到文件中n看到我了吧!")  
# Read a file with open("test.txt", "rt") as in_file:
     text = in_file.read() 
print(text) 

执行以上代码输出结果为:

 该文本会写入到文件中 看到我了吧! 

Python 文件 IO Python3 实例

Python 使用递归斐波那契数列

Python 使用递归斐波那契数列

Python 使用递归斐波那契数列 Python3 实例

以下代码使用递归的方式来生成斐波那契数列:


# Filename : test.py
 
  def recur_fibo(n):
    """递归函数
    输出斐波那契数列"""
    if n <= 1:
 


return n
    else:
 
  return(recur_fibo(n-1) + recur_fibo(n-2))  
# 获取用户输入 nterms = int(input("您要输出几项? ")) 
# 检查输入的数字是否正确 if nterms <= 0:
  
print("输入正数")
 else:
  
print("斐波那契数列:")
    for i in range(nterms):
 

print(recur_fibo(i)) 

执行以上代码输出结果为:

 您要输出几项? 10 斐波那契数列: 0 1 1 2 3 5 8 13 21 34 

Python 使用递归斐波那契数列 Python3 实例