cv2和PIL.Image之间的转换

版权声明:本文为博主原创文章,未经博主允许不得转载O(∩_∩)O https://blog.csdn.net/qq_38153833/article/details/88060268

PIL.Image转换成OpenCV格式:

    import cv2  
    from PIL import Image  
    import numpy  
      
    image = Image.open("plane.jpg")  
    image.show()  
    img = cv2.cvtColor(numpy.asarray(image),cv2.COLOR_RGB2BGR)  
    cv2.imshow("OpenCV",img)  
    cv2.waitKey()  

cv2保存图片用cv2.imwrite("/home/1.jpg" ,frame * 1) # *1才为彩色,后面*1可以不写
cv2看图片大小用 img.shape # 它的输出是(480, 640, 3),记住这里宽是480,长是640,深度是3色的彩色
cv2裁剪用img = img[60:420, 60:580, :] #eg:[宽为60~(480-60),长为60~(640-60),第三个是选择全部深度]

OpenCV转换成PIL.Image格式:

    import cv2  
    from PIL import Image  
    import numpy  
      
    img = cv2.imread("plane.jpg")  
    cv2.imshow("OpenCV",img)  
    image = Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))  
    image.show()  
    cv2.waitKey() 

PIL的Image保存图片用img.save(“001.jpg”)
PIL的Image看图片大小用frame.size
PIL的Image裁剪用crop

# box = (100, 100,lab_w-100,lab_h-100)  # 左 上 右 下(控制裁剪框大小)(前两个小于后两个数值)
# img = img.crop(box)

还有tabel里面画框用cv2.rectangle

# 画框-->cv2.rectangle
frame = cv2.rectangle(frame, (100,100 ), (lab_w-100,lab_h-100 ), (0, 0, 255), 6)  #后面两个分别是颜色和框的宽度

不要cv2转换PIL的Image,此时还是480宽,640高,再来放大原来label大小再来crop裁剪,这样放大会丢失所以还是原图修改,直接按比例就好附上我自己的代码来提高图像稳定性

    def Preheat(self):
        temperature = True  # 用来对比,有按下后没按下两者稳定性是否有很大差别,True表示预热去掉边框外的影响,False表示原来整张图加载进去的
        capture = self.capture  # 当然我前面def __init__里面有self.capture = cv2.VideoCapture(0)
        # 获取一帧
        ret,frame = capture.read()
        # print(frame.shape)
        # print("lab_w:%d" % (lab_w))
        # print("lab_h:%d" % (lab_h))

        frame = cv2.flip(frame, flipCode=1)  # 水平翻转,我label是1356长,837宽
        x = int(100/837*480)  # 因为下面不准有小数所以转int,有那么一行误差啦不影响
        w = int(480-100/837*480)
        y = int(100/1356*640)
        h = int(640-100/1356*640)
        frame = frame[x:w, y:h, :]  # 这个cv2里面的裁剪,eg:[宽为60~(480-60),长为60~(640-60),第三个是选择全部深度]
        cv2.imwrite("000.jpg",frame)

还有提醒一下:如果是显示视频的话,还是用cv2.imshow(‘frame’,img),因为死循环while image.show()会不断创建新进程。

猜你喜欢

转载自blog.csdn.net/qq_38153833/article/details/88060268