รู้หรือไม่? กล้องวงจรปิดจากจีน ไม่จำเป็นต้องดูผ่านแอพของผู้ให้บริการก็ได้

สวัสดีครับ ในกระทู้นี้ผมจะมาพูดถึงกล้องวงจรปิดราคาถูกจากจีนตระกูล 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] คลิกเพื่อดูข้อความที่ซ่อนไว้
แสดงความคิดเห็น
โปรดศึกษาและยอมรับนโยบายข้อมูลส่วนบุคคลก่อนเริ่มใช้งาน อ่านเพิ่มเติมได้ที่นี่