สวัสดีครับ ในกระทู้นี้ผมจะมาพูดถึงกล้องวงจรปิดราคาถูกจากจีนตระกูล FH8616 ซึ่งมีราคาถูกมากในท้องตลาด
แต่ก็แลกมาด้วยโฆษณาที่เยอะเกินไป จะกดเข้าดูแบบรีบๆก็มาติดโฆษณาอีก กว่าจะได้ดูก็หลายนาที
ถ้าไม่ดูผ่านแอพของกล้องแล้วต้องทำยังไง ?
ก่อนอื่นต้องขอบอกไว้ตรงนี้ก่อนนะครับว่าเหมาะกับคนที่มีความรู้ด้านนี้อยู่แล้ว
การที่เราจะไม่เข้าใช้งานผ่านแอพที่มากับกล้องคือ เราจะต้องดึงภาพผ่าน RTSP
โดยค่าเริ่มต้นของกล้องรุ่น FH8616 จะตั้งค่ามาดังนี้
rtsp://admin:admin123456@
[IP ของกล้องที่บ้านคุณ]:8554/profile0
ตัวอย่าง: rtsp://admin:admin123456@192.168.1.101:8554/profile0
แล้วเราจะดูได้ผ่านโปรแกรมไหน ?
เราสามาถดูได้ผ่านโปรแกรมดังนี้ครับ
1. VLC ฟรี (สามารถดูได้อย่างเดียว)
2. Agent DVR ฟรี มีโหมดตรวจจับการเคลื่อนไหว และโหมดบันทึกตลอดเวลา (สามารถใช้ทำเป็นที่เก็บวีดีโอได้หากกล้องถูกทำลาย)
ในมือถือ
1. RTSP Player
ต่อไปจะเกี่ยวกับโค๊ดนะครับ ส่วนนี้สำหรับผู้ที่สนใจทำเป็นระบบตรวจจับการเคลื่อนไหว
โค๊ดนี้มีฟังก์ชั่น ตรวจจับการเคลื่อนไหว แล้วส่งเข้า Telagram
import cv2
import time
import os
import requests
# ===== CONFIG =====
RTSP_URL = 'rtsp://admin:admin123456@192.168.1.101:8554/profile0'
TELEGRAM_TOKEN = 'แทนที่ของคุณ'
TELEGRAM_CHAT_ID = 'แทนที่ของคุณ'
MIN_AREA = 10000 # ขนาดพื้นที่เคลื่อนไหวที่ตรวจจับ
SEND_INTERVAL = 5 # วินาที ระหว่างการส่งภาพ
# พื้นที่ตรวจจับ (ROI)
ROI_X1, ROI_Y1 = 100, 100 # มุมซ้ายบน
ROI_X2, ROI_Y2 = 1200, 800 # มุมขวาล่าง
# ==================
cap = cv2.VideoCapture(RTSP_URL)
if not cap.isOpened():
print("❌ ไม่สามารถเชื่อมต่อกล้อง RTSP ได้")
exit()
fgbg = cv2.createBackgroundSubtractorMOG2()
last_sent_time = 0
print("✅ เริ่มระบบตรวจจับการเคลื่อนไหว...")
while True:
ret, frame = cap.read()
if not ret:
print("❌ ไม่สามารถอ่านภาพจากกล้องได้")
break
# วาดกรอบสีแดงเพื่อแสดงพื้นที่ ROI ที่ตรวจจับ
cv2.rectangle(frame, (ROI_X1, ROI_Y1), (ROI_X2, ROI_Y2), (0, 0, 255), 2) # กรอบสีแดง
# ครอบภาพในพื้นที่ที่ต้องการตรวจจับ (ROI)
frame_roi = frame[ROI_Y1:ROI_Y2, ROI_X1:ROI_X2]
gray_roi = cv2.cvtColor(frame_roi, cv2.COLOR_BGR2GRAY)
mask = fgbg.apply(gray_roi)
# ลบ noise
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
motion_detected = False
for contour in contours:
if cv2.contourArea(contour) > MIN_AREA:
motion_detected = True
x, y, w, h = cv2.boundingRect(contour)
# ขยาย bounding box กลับไปที่ขนาดเต็มของภาพ
x += ROI_X1
y += ROI_Y1
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) # กรอบสีเขียว
now = time.time()
if motion_detected and (now - last_sent_time > SEND_INTERVAL):
last_sent_time = now
filename = "motion.jpg"
cv2.imwrite(filename, frame)
print("📸 ตรวจพบการเคลื่อนไหว - ส่งภาพไป Telegram")
try:
with open(filename, 'rb') as photo:
url = f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendPhoto"
data = {'chat_id': TELEGRAM_CHAT_ID, 'caption': '🚨 ตรวจพบการเคลื่อนไหว'}
files = {'photo': photo}
response = requests.post(url, data=data, files=files)
if response.status_code == 200:
print("✅ ส่งภาพเรียบร้อยแล้ว")
else:
print(f"❌ ส่งภาพไม่สำเร็จ: {response.status_code} - {response.text}")
except Exception as e:
print(f"❌ เกิดข้อผิดพลาดขณะส่งภาพ: {e}")
# แสดงภาพ debug
cv2.imshow('Motion Detection', frame)
if cv2.waitKey(1) == 27: # ESC เพื่อหยุด
print("🛑 หยุดระบบตามคำสั่งผู้ใช้")
break
cap.release()
cv2.destroyAllWindows()
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้สามารถเช็ค IP ได้จากเร้าเตอร์ หรือ รายละเอียดของกล้องภายในแอป
รู้หรือไม่? กล้องวงจรปิดจากจีน ไม่จำเป็นต้องดูผ่านแอพของผู้ให้บริการก็ได้
แต่ก็แลกมาด้วยโฆษณาที่เยอะเกินไป จะกดเข้าดูแบบรีบๆก็มาติดโฆษณาอีก กว่าจะได้ดูก็หลายนาที
ถ้าไม่ดูผ่านแอพของกล้องแล้วต้องทำยังไง ?
ก่อนอื่นต้องขอบอกไว้ตรงนี้ก่อนนะครับว่าเหมาะกับคนที่มีความรู้ด้านนี้อยู่แล้ว
การที่เราจะไม่เข้าใช้งานผ่านแอพที่มากับกล้องคือ เราจะต้องดึงภาพผ่าน RTSP
โดยค่าเริ่มต้นของกล้องรุ่น FH8616 จะตั้งค่ามาดังนี้
rtsp://admin:admin123456@[IP ของกล้องที่บ้านคุณ]:8554/profile0
ตัวอย่าง: rtsp://admin:admin123456@192.168.1.101:8554/profile0
แล้วเราจะดูได้ผ่านโปรแกรมไหน ?
เราสามาถดูได้ผ่านโปรแกรมดังนี้ครับ
1. VLC ฟรี (สามารถดูได้อย่างเดียว)
2. Agent DVR ฟรี มีโหมดตรวจจับการเคลื่อนไหว และโหมดบันทึกตลอดเวลา (สามารถใช้ทำเป็นที่เก็บวีดีโอได้หากกล้องถูกทำลาย)
ในมือถือ
1. RTSP Player
ต่อไปจะเกี่ยวกับโค๊ดนะครับ ส่วนนี้สำหรับผู้ที่สนใจทำเป็นระบบตรวจจับการเคลื่อนไหว
โค๊ดนี้มีฟังก์ชั่น ตรวจจับการเคลื่อนไหว แล้วส่งเข้า Telagram
import time
import os
import requests
# ===== CONFIG =====
RTSP_URL = 'rtsp://admin:admin123456@192.168.1.101:8554/profile0'
TELEGRAM_TOKEN = 'แทนที่ของคุณ'
TELEGRAM_CHAT_ID = 'แทนที่ของคุณ'
MIN_AREA = 10000 # ขนาดพื้นที่เคลื่อนไหวที่ตรวจจับ
SEND_INTERVAL = 5 # วินาที ระหว่างการส่งภาพ
# พื้นที่ตรวจจับ (ROI)
ROI_X1, ROI_Y1 = 100, 100 # มุมซ้ายบน
ROI_X2, ROI_Y2 = 1200, 800 # มุมขวาล่าง
# ==================
cap = cv2.VideoCapture(RTSP_URL)
if not cap.isOpened():
print("❌ ไม่สามารถเชื่อมต่อกล้อง RTSP ได้")
exit()
fgbg = cv2.createBackgroundSubtractorMOG2()
last_sent_time = 0
print("✅ เริ่มระบบตรวจจับการเคลื่อนไหว...")
while True:
ret, frame = cap.read()
if not ret:
print("❌ ไม่สามารถอ่านภาพจากกล้องได้")
break
# วาดกรอบสีแดงเพื่อแสดงพื้นที่ ROI ที่ตรวจจับ
cv2.rectangle(frame, (ROI_X1, ROI_Y1), (ROI_X2, ROI_Y2), (0, 0, 255), 2) # กรอบสีแดง
# ครอบภาพในพื้นที่ที่ต้องการตรวจจับ (ROI)
frame_roi = frame[ROI_Y1:ROI_Y2, ROI_X1:ROI_X2]
gray_roi = cv2.cvtColor(frame_roi, cv2.COLOR_BGR2GRAY)
mask = fgbg.apply(gray_roi)
# ลบ noise
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
motion_detected = False
for contour in contours:
if cv2.contourArea(contour) > MIN_AREA:
motion_detected = True
x, y, w, h = cv2.boundingRect(contour)
# ขยาย bounding box กลับไปที่ขนาดเต็มของภาพ
x += ROI_X1
y += ROI_Y1
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) # กรอบสีเขียว
now = time.time()
if motion_detected and (now - last_sent_time > SEND_INTERVAL):
last_sent_time = now
filename = "motion.jpg"
cv2.imwrite(filename, frame)
print("📸 ตรวจพบการเคลื่อนไหว - ส่งภาพไป Telegram")
try:
with open(filename, 'rb') as photo:
url = f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendPhoto"
data = {'chat_id': TELEGRAM_CHAT_ID, 'caption': '🚨 ตรวจพบการเคลื่อนไหว'}
files = {'photo': photo}
response = requests.post(url, data=data, files=files)
if response.status_code == 200:
print("✅ ส่งภาพเรียบร้อยแล้ว")
else:
print(f"❌ ส่งภาพไม่สำเร็จ: {response.status_code} - {response.text}")
except Exception as e:
print(f"❌ เกิดข้อผิดพลาดขณะส่งภาพ: {e}")
# แสดงภาพ debug
cv2.imshow('Motion Detection', frame)
if cv2.waitKey(1) == 27: # ESC เพื่อหยุด
print("🛑 หยุดระบบตามคำสั่งผู้ใช้")
break
cap.release()
cv2.destroyAllWindows()