您的位置:首页 > 运维架构

opencv 学习笔记 (图像基础)

2016-06-08 15:59 429 查看

1. 读图像,显示图像,保存图像

读图像,显示的格式有:彩色(1) cv2.IMREAD_COLOR,灰度(0) cv2.IMREAD_GRAYSCALE

import cv2
img = cv2.imread('01.png', cv2.IMREAD_COLOR)
cv2.imshow('image', img)
k = cv2.waitKey(0)
cv2.imwrite('02.png', img)
cv2.destroyAllWindows()


彩色的img的shape对应 hight, width, channel,通道对应[blue, green, red],每个点位三个颜色通道的值,当分量为0,表示没有该颜色分量,最大值为255,处理后的 img2 没有红色分量

>>> img.shape
>>> [611,736,3]
>>> cc = [1, .5, 0]  # blue, green, red BGR
>>> img2 = img * cc


灰色图像对应的shape为 ,每个点位一个灰度值

>>> img.shape
>>> [611,736]


显示图像等待时长,0为无限时长等待,k = cv2.waitKey(0),可以选择其他方式退出,按esc为’27’,或者按’S’键保存图像

k = cv2.waitKey(0)
if k == 27:
cv2.destroyAllWindows()
if k == ord('s'):
cv2.imwrite('neo_great.png', img)
cv2.destroyAllWindows()


显示图像可以用pylab,但是注意用pylab的显示颜色为RGB,要保证和原图像一致,需颠倒颜色通道顺序

import pylab as pl
img=cv2.imread('01.png')
img=img[:,:,::-1]
# b,g,r=cv2.split(img) 或者 b,g,r=(img[:,:,0],img[:,:,1],img[:,:,2])
# img=cv2.merge([r,g,b])
pl.imshow(img)
pl.show()


提取某一象素点的颜色,或者直接修改

px = img[100,100]
>>> print px
>>> [157 166 200]
img[10,10]=[0,0
4000
,255]


照10张棋盘图片,用于标定相机

def take_photo():
cap=cv2.VideoCapture(0)
i=0
while True:
ret,frame=cap.read()
cv2.imshow('img', frame)
k=cv2.waitKey(1)
if k==ord('s'):
cv2.imwrite('front_%d.png'%i,frame)
i+=1
if i==10:
break
cap.release()
cv2.destroyAllWindows()


2. 相机标定

对象点,是3D空间的点,用numpy创建这些点,去Z=0平面上的点,角点个数为x*y

图像点,是2D平面的点,就是用 cv2.findChessboardCorners 这个函数找出图像上的(x,y)个角点,corner就是角点在图像上的坐标,就是图像点

def calibrate(x,y,n=10):
objpoints=[]
imgpoints=[]
for i in range(n):
# object points
objp=np.zeros((x*y,3),np.float32)
objp[:,:2]=np.mgrid[0:x,0:y].T.reshape(-1,2)
# image points
img=cv2.imread('front_%d.png'%i,cv2.IMREAD_GRAYSCALE)
ret,corner=cv2.findChessboardCorners(img,(x,y),None)
if ret==True:
objpoints.append(objp)
imgpoints.append(corner)
ret,mtx,dist,rvec,tvec=cv2.calibrateCamera(objpoints,imgpoints,img.shape[::-1],None,None)
return corner,mtx,dist,rvec,tvec
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: