1. 前言🤖
自从孩子上小学后,天天问各种让我回答不上来的奇怪的问题。最近又迷恋上用放大镜到处找东西观察,而且还对放大到更大的微观世界想进行观察👀。
我无意中说显微镜可以观察到细胞,他就开始让我给他搞一个显微镜😢。贫困的家庭显然不能斥巨资去购买那么高端的设备😊。好在有大佬已经DIY制作了显微镜,成本还相当可观💕。
打印组装完成后使用发现不是特别的方便😂,眼睛盯着镜头看,手需要调整目镜和玻片的位置,想观察到一个比较好的“相”相当的麻烦。特别是还想把观察到的“相”拍照保存下来就更加的麻烦🤦♀️。

于是我想到了使用摄像头安装在镜头的前端,PC端显示呈现的“相”,这样保存也方便,观察也方便了。🤞。
2. 方案选择🐱🚀
最开始尝试的是使用小安派Cam-D200, 它的体积足够的小巧。在实际试验时感觉到它的帧率当比
BW21-CBV差了不少。遂选择使用BW21-CBV。🎉
有了这个基础,就可以考虑把镜头安装在目镜的位置了。
3. 镜头安装🙌
首先设计一个简单的套筒把BW21-CBV的镜头固定住,这样方便BW21-CBV和目镜进行固定连接。

随后就是确定目镜和摄像头的位置。设计一个下方的卡口和目镜进行固定,卡口的边缘刚好和目镜挂接。

开启3D打印机把这两个结构件制造出来。

目镜和结构件进行组装。

至此,目镜和摄像头就安装好了。
4. 代码配合
PC端为了自己可以处理图像,编写python代码来对视频流进行捕获,并显示出来😊。当然,也可以后面来进行细胞计数等高级的玩法。
import cv2
# 设置 RTSP URL
RTSP_URL = 'rtsp://192.168.68.204:554'
# 创建 VideoCapture 对象
cap = cv2.VideoCapture(RTSP_URL, cv2.CAP_FFMPEG)
# 检查是否成功打开 RTSP 流
if not cap.isOpened():
print('Cannot open RTSP stream')
exit(-1)
# 循环读取帧并显示
while True:
ret, frame = cap.read()
if not ret:
break
frame = cv2.resize(frame, (800,600))
cv2.imshow('RTSP stream', frame)
if cv2.waitKey(1) == 27: # 按下 ESC 键退出
break
# 释放资源
cap.release()
cv2.destroyAllWindows()

BW21-CBV的代码参考example中的video-only进行修改。
#include "WiFi.h"
#include "StreamIO.h"
#include "VideoStream.h"
#include "RTSP.h"
#define CHANNEL 0 // Channel 0 : 1920 x 1080 30FPS H264
VideoSetting config(CHANNEL);
RTSP rtsp;
StreamIO videoStreamer(1, 1); // 1 Input Video -> 1 Output RTSP
char ssid[] = "JDC_great_5G";
char pass[] = "buyaolianwo789";
int status = WL_IDLE_STATUS;
void setup()
{
Serial.begin(115200);
// attempt to connect to Wifi network:
while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(ssid);
status = WiFi.begin(ssid, pass);
// wait 2 seconds for connection:
delay(2000);
}
// Configure camera video channel with video format information
// Adjust the bitrate based on your WiFi network quality
// config.setBitrate(2 * 1024 * 1024); // Recommend to use 2Mbps for RTSP streaming to prevent network congestion
Camera.configVideoChannel(CHANNEL, config);
Camera.videoInit();
// Configure RTSP with identical video format information
rtsp.configVideo(config);
rtsp.begin();
// Configure StreamIO object to stream data from video channel to RTSP
videoStreamer.registerInput(Camera.getStream(CHANNEL));
videoStreamer.registerOutput(rtsp);
if (videoStreamer.begin() != 0) {
Serial.println("StreamIO link start failed");
}
// Start data stream from video channel
Camera.channelBegin(CHANNEL);
delay(1000);
printInfo();
}
void loop()
{
// Do nothing
}
void printInfo(void)
{
Serial.println("------------------------------");
Serial.println("- Summary of Streaming -");
Serial.println("------------------------------");
Camera.printInfo();
IPAddress ip = WiFi.localIP();
Serial.println("- RTSP -");
Serial.print("rtsp://");
Serial.print(ip);
Serial.print(":");
rtsp.printInfo();
}
5. 效果展示🎉
这是一个洋葱皮的观察图片。


感觉回到了中考的“洋葱表皮细胞观察”哈哈。挺好玩。最后来看看这个项目的全家福。
