查看: 250|回复: 3

[项目] 【智控万物】掌控监视器

[复制链接]
本帖最后由 云天 于 2021-1-21 14:35 编辑

ThuJanuary-202101211654..png


【项目背景】受到了“yywudao”的“[入门教程][2020]掌控板显示图片(三)-- 进阶版处理图片及显示动画”的启发,作者用掌控板播放了“Bad apple”。我也重现了此显示。

IMG_20210121_112341.jpg



顺着作者的想法,既然能播放动画,那应该也有播放视频流,下面是演示视频。
IMG_20210121_133416.jpg




【项目设计】


前期工作请参考:https://mc.dfrobot.com.cn/thread-302527-1-1.html

【准备工作】

电脑要安装:
1、python3(Python3 教程 | 菜鸟教程)
2、cv2(pip3 install --user opencv-python)
3、numpy(pip install --user numpy,我的之前安装过,出了问题,解决方法:先pip uninstall numpy,确保完全卸载numpy,再pip install --user numpy

【电脑端】

1、Python获取摄像头图像


注意Python采用代码缩进和冒号( : )来区分代码块之间的层次。

  1. #pip3 install --user opencv-python
  2. #先pip uninstall numpy,确保完全卸载numpy,再pip install --user numpy
  3. def main():
  4. import cv2
  5. import numpy as np
  6. import socket
  7. import time
  8. import binascii
  9. cap = cv2.VideoCapture(0)
  10. while(1):    # get a frame and show   
  11.     ret, frame = cap.read()
  12.     if(ret):
  13.         cv2.imshow('Capture', frame)
复制代码

ThuJanuary-202101212465..png


2、图像灰度处理:

def main():
import cv2
import numpy as np
import socket
import time
import binascii
cap = cv2.VideoCapture(0)
while(1): # get a frame and show
    ret, frame = cap.read()
    if(ret):
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        cv2.imshow('Capture1', frame)
        cv2.imshow('Capture2', gray)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
cv2.destroyAllWindows()
if __name__=='__main__':
    main()


ThuJanuary-202101216503..png


3、图片黑白二值化处理

def main():
import cv2
import numpy as np
import socket
import time
import binascii
cap = cv2.VideoCapture(0)
while(1): # get a frame and show
    ret, frame = cap.read()
    if(ret):
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        BIN= cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11,2)
        cv2.imshow('Capture1', frame)
        cv2.imshow('Capture2', BIN)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
cv2.destroyAllWindows()
if __name__=='__main__':
    main()



ThuJanuary-202101216551..png


void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue,int adaptiveMethod, int thresholdType, int blockSize, double C)
这种办法就是自适应阈值法(adaptiveThreshold),它的思想不是计算全局图像的阈值,而是根据图像不同区域亮度分布,计算其局部阈值,所以对于图像不同区域,能够自适应计算不同的阈值,因此被称为自适应阈值法。(其实就是局部阈值法)

说明下各参数:

InputArray src:源图像

OutputArray dst:输出图像,与源图像大小一致

int adaptiveMethod:在一个邻域内计算阈值所采用的算法,有两个取值,分别为 ADAPTIVE_THRESH_MEAN_C 和 ADAPTIVE_THRESH_GAUSSIAN_C 。

ADAPTIVE_THRESH_MEAN_C的计算方法是计算出领域的平均值再减去第七个参数double C的值。

ADAPTIVE_THRESH_GAUSSIAN_C的计算方法是计算出领域的高斯均值再减去第七个参数double C的值。

int thresholdType:这是阈值类型,只有两个取值,分别为 THRESH_BINARY 和THRESH_BINARY_INV  具体的请看官方的说明,这里不多做解释。

int blockSize:adaptiveThreshold的计算单位是像素的邻域块,这是局部邻域大小,3、5、7等。

double C:这个参数实际上是一个偏移值调整量,用均值和高斯计算阈值后,再减或加这个值就是最终阈值。


可自行调整相应参数:
ThuJanuary-202101218524..png

ThuJanuary-202101217171..png

【数据处理】

1、图像压缩
压缩为128*64(掌控板oled屏幕分辨率)


def main():
import cv2
import numpy as np
import socket
import time
import binascii
cap = cv2.VideoCapture(0)
W=128
H=64
size = (W,H)
while(1): # get a frame and show
    ret, frame = cap.read()
    if(ret):
        frame = cv2.resize(frame, size)
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        BIN= cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,25,5)
        cv2.imshow('Capture1', frame)
        cv2.imshow('Capture2', BIN)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
cv2.destroyAllWindows()
if __name__=='__main__':
    main()


ThuJanuary-202101211639..png



2、查看二值化后的数据:

def main():
import cv2
import numpy as np
import socket
import time
import binascii
cap = cv2.VideoCapture(0)
W=128
H=64
size = (W,H)
while(1): # get a frame and show
    ret, frame = cap.read()
    if(ret):
        frame = cv2.resize(frame, size)
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        BIN= cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,25,5)
        cv2.imshow('Capture1', frame)
        cv2.imshow('Capture2', BIN)
        for h in range(H):
            for w in range(W):
                    print(BIN[h][w],end="")
            print()
        #if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cv2.destroyAllWindows()
if __name__=='__main__':
    main()

ThuJanuary-202101217243..png



从上图看出,大于阈值的都显示为“255”,但“255”不是我想要的,我要的是“1”。

修改下面的代码,大于阈值的输出为“1”。


BIN= cv2.adaptiveThreshold(gray,1,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,25,5)

但这样,窗口就无法显示图像了。“
1”相对“255”接近于“0”,窗口显示为全黑。所以将图像拷贝一份用来窗口显示,另一份用来进行数据处理。

def main():
import cv2
import numpy as np
import socket
import time
import binascii
cap = cv2.VideoCapture(0)
W=128
H=64
size = (W,H)
while(1): # get a frame and show
    ret, frame1 = cap.read()
    if(ret):
        frame2=frame1.copy()
        frame1 = cv2.resize(frame1, size)
        gray1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
        gray2 = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
       BIN1= cv2.adaptiveThreshold(gray1,1,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,7,3)
        BIN2= cv2.adaptiveThreshold(gray2,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,7,3)
        cv2.imshow('Capture1', frame2)
        cv2.imshow('Capture2', BIN2)
        for h in range(H):
            for w in range(W):
              print(BIN1[h][w],end="")
            print()
        #if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cv2.destroyAllWindows()
if __name__=='__main__':
    main()



ThuJanuary-202101216249..png
"0"和“1”展示自我

【分析数据】

掌控板能显示“pbm”图像文件,看一下Bad Apple“123.pbm”文件数据内容:
5帧badapple_pbm.zip (309.84 KB, 下载次数: 0)

hnyzcj  版主

发表于 2021-1-21 15:42:53

8错
回复

使用道具 举报

rzyzzxw  版主

发表于 2021-1-21 15:55:49

超赞
回复

使用道具 举报

gray6666  初级技神

发表于 2021-1-23 12:53:42

还是CV2好用,而且教程也经典
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2021 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail