Hi @AastaLLL ,
** I know you can reject this request due to NVIDIA not support CSI camera for this Project , But you can have look and share your advices
As per chatGpt below is the updated code for tree_demo.py could you please verify below code ..
this code should be run for both CSI or USB WEB camera ..**And if we updated the CSI Camera will work directly from container ? as also face issue during from inside/outside container , Recognition issues .
**
import asyncio
import argparse
from aiohttp import web, WSCloseCode
import logging
import weakref
import cv2
import time
import PIL.Image
import matplotlib.pyplot as plt
from typing import List
from nanoowl.tree import Tree
from nanoowl.tree_predictor import TreePredictor
from nanoowl.tree_drawing import draw_tree_output
from nanoowl.owl_predictor import OwlPredictor
# -------- GStreamer Pipeline for CSI Camera (Jetson) -------- #
def gstreamer_pipeline(sensor_id=0, width=640, height=480, framerate=30, flip_method=0):
"""
Builds a GStreamer pipeline string to access a CSI camera (e.g. IMX219) on NVIDIA Jetson devices.
"""
return (
f"nvarguscamerasrc sensor_id={sensor_id} ! "
f"video/x-raw(memory:NVMM), width={width}, height={height}, "
f"format=NV12, framerate={framerate}/1 ! nvvidconv flip-method={flip_method} ! "
f"video/x-raw, width={width}, height={height}, format=BGRx ! "
f"videoconvert ! video/x-raw, format=BGR ! appsink"
)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("image_encode_engine", type=str)
parser.add_argument("--image_quality", type=int, default=50)
parser.add_argument("--port", type=int, default=7860)
parser.add_argument("--host", type=str, default="0.0.0.0")
# ✅ Camera type selection: USB or CSI
parser.add_argument("--camera_type", type=str, default="usb", choices=["usb", "csi"],
help="Select camera type: 'usb' uses /dev/video*, 'csi' uses Jetson CSI camera.")
parser.add_argument("--camera", type=int, default=0,
help="Camera index: For USB it is /dev/videoX, for CSI it is sensor_id value.")
parser.add_argument("--resolution", type=str, default="640x480", help="Resolution in WIDTHxHEIGHT format")
parser.add_argument("--framerate", type=int, default=30, help="FPS for CSI camera")
args = parser.parse_args()
width, height = map(int, args.resolution.split("x"))
# Initialize the predictor
predictor = TreePredictor(
owl_predictor=OwlPredictor(
image_encoder_engine=args.image_encode_engine
)
)
# Global prompt data (text to detect)
prompt_data = None
# Initialize camera depending on selected type
if args.camera_type == "csi":
cam_str = gstreamer_pipeline(sensor_id=args.camera, width=width, height=height, framerate=args.framerate)
camera = cv2.VideoCapture(cam_str, cv2.CCAP_GSTREAMER)
logging.info(f"Using CSI Camera (sensor_id={args.camera})")
else:
camera = cv2.VideoCapture(args.camera)
camera.set(cv2.CAP_PROP_FRAME_WIDTH, width)
camera.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
logging.info(f"Using USB Camera (/dev/video{args.camera})")
✅ ✔ How to Run It
🔹 USB Camera (default /dev/video0):
python3 app.py vit_base_patch16_224 --camera_type usb --camera 0 --resolution 1280x720
🔹 CSI Camera (Jetson IMX219):
python3 app.py vit_base_patch16_224 --camera_type csi --camera 0 --resolution 1280x720 --framerate 30