用AI Thinker ESP32-CAM板子访问公网ip的5112端口并上传你的摄像头拍摄的图像视频数据,并写一段python程序打开弹窗接受图像实现超远程图像传输教程免费
1.
首先你要有一个公网ip也就是去买一台拥有公网的服务器电脑,我买的是腾讯云1年38元的服务器还可以不是很贵,这种电脑拥有公网ip也就是说捏能够手机电脑访问公网实现远程与另外地区的设备建立联系,比如我在深圳的esp32cam我在云浮也能看到画面
买完之后右上角控制台,点进去登录你的服务器
点击你买好的服务器
像我就是买的轻量级就点击它,可以看到你的服务器,右边下拉点击查看详情
往下滑找到镜像,然后可以选择重装系统,一般我都是直接装Ubuntu简单点,制作镜像是用来保存系统配置文件等等,你下次可以选择你做的镜像加载到另一台服务器直接复制一台一摸一样的
点进去填写这些:
不选最新的系统是因为有些软件不一定支持这个版本的系统
点击确认就安装系统成功了
2.
然后下载配置宝塔
去官网下载:宝塔面板下载,免费全能的服务器运维软件
选择你的服务器系统类型复制脚本,我的是·linux Ubuntu的
复制命令:wget -O install_panel.sh https://download.bt.cn/install/install_panel.sh && sudo bash install_panel.sh ed8484bec
然后登录年装好系统的服务器:
登陆进去就进入你服务器电脑的控制台了
把脚本粘贴回车直接下载
下载成功后他会给你一个长这样的东西,把她复制下来粘贴到你的txt文件最好改下密码,比如现在这个密码就是我的旧密码不然你们不是可以登陆我的电脑了吗hhh
然后去访问他给你的外网ipv4面板网址
输入账号密码
进去找到软件商店之后点开他,在软件搜索frp下载
安装好后点开他,再次安装服务器端安装好后就是我这个样子,我们把我们的服务器作为服务器端电脑作为客户端 然后打开配置文件:
备用
去github下载对应的
按他给的软件版本下载我这是0.52.3,他给的链接有问题不如我自己去找
Releases · fatedier/frp
下载后解压,打开:
打开里面的frpc.toml
按你之前的配置来
填进去
然后去宝塔安全把端口打开:
腾讯云防火墙端口也打开
然后点开你解压的文件的终端
进去输入
然后就可以烧录esp32cam程序:
#include "esp_camera.h"
#include <WiFi.h>
#include <HTTPClient.h>
// WiFi配置
const char *ssid = "Redmi K70";
const char *password = "ss20051512";
// 手动定义摄像头引脚 (AI Thinker ESP32-CAM)
#define PWDN_GPIO_NUM 32
#define RESET_GPIO_NUM -1 // 未使用
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27
#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22
void setup() {
Serial.begin(115200);
// 摄像头配置
camera_config_t config;
config.ledc_channel = LEDC_CHANNEL_0;
config.ledc_timer = LEDC_TIMER_0;
config.pin_d0 = Y2_GPIO_NUM;
config.pin_d1 = Y3_GPIO_NUM;
config.pin_d2 = Y4_GPIO_NUM;
config.pin_d3 = Y5_GPIO_NUM;
config.pin_d4 = Y6_GPIO_NUM;
config.pin_d5 = Y7_GPIO_NUM;
config.pin_d6 = Y8_GPIO_NUM;
config.pin_d7 = Y9_GPIO_NUM;
config.pin_xclk = XCLK_GPIO_NUM;
config.pin_pclk = PCLK_GPIO_NUM;
config.pin_vsync = VSYNC_GPIO_NUM;
config.pin_href = HREF_GPIO_NUM;
config.pin_sscb_sda = SIOD_GPIO_NUM;
config.pin_sscb_scl = SIOC_GPIO_NUM;
config.pin_pwdn = PWDN_GPIO_NUM;
config.pin_reset = RESET_GPIO_NUM;
config.xclk_freq_hz = 20000000;
config.pixel_format = PIXFORMAT_JPEG;
if (psramFound()) {
config.frame_size = FRAMESIZE_SVGA; // 800x600
config.jpeg_quality = 12; // 0-63(数值越小质量越高)
config.fb_count = 2;
} else {
config.frame_size = FRAMESIZE_CIF; // 400x296
config.jpeg_quality = 12;
config.fb_count = 1;
}
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK) {
Serial.printf("摄像头初始化失败: 0x%x", err);
return;
}
// 连接WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi已连接");
}
void loop() {
if (WiFi.status() == WL_CONNECTED) {
camera_fb_t *fb = esp_camera_fb_get();
if (!fb) {
Serial.println("图像捕获失败");
return;
}
HTTPClient http;
http.begin("http://159.75.100.98:5112/upload");
http.addHeader("Content-Type", "image/jpeg");
int httpResponseCode = http.POST(fb->buf, fb->len);
if (httpResponseCode > 0) {
Serial.printf("HTTP响应码: %d\n", httpResponseCode);
} else {
Serial.printf("错误: %s\n", http.errorToString(httpResponseCode).c_str());
}
http.end();
esp_camera_fb_return(fb);
}
delay(1000);
}
from flask import Flask, request
import cv2
import numpy as np
import threading
app = Flask(__name__)
latest_frame = None
lock = threading.Lock()
@app.route('/upload', methods=['POST'])
def upload():
global latest_frame
image_bytes = request.data
if image_bytes:
nparr = np.frombuffer(image_bytes, np.uint8)
frame = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
with lock:
latest_frame = frame.copy()
return "OK", 200
return "No data", 400
def show_video():
while True:
with lock:
if latest_frame is not None:
cv2.imshow('ESP32-CAM Stream', latest_frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
if __name__ == "__main__":
t = threading.Thread(target=show_video)
t.daemon = True
t.start()
app.run(host='0.0.0.0', port=5112, threaded=True)
完成: