From 623051c116797817e45232311fc14b89aac21392 Mon Sep 17 00:00:00 2001 From: ZockerKatze Date: Thu, 27 Feb 2025 16:04:23 +0100 Subject: [PATCH] Initial commit --- .gitignore | 63 +++ README.md | 115 +++++ coco.names | 80 ++++ opencam/image.jpg | Bin 0 -> 136093 bytes opencam/main.py | 294 ++++++++++++ opencamcpp/CMakeLists.txt | 137 ++++++ opencamcpp/CMakePresets.json | 22 + opencamcpp/CMakeUserPresets.json | 40 ++ opencamcpp/build_appimage.sh | 90 ++++ opencamcpp/build_opencv.sh | 83 ++++ opencamcpp/icon.png | Bin 0 -> 11737 bytes opencamcpp/icon.svg | 7 + opencamcpp/main.cpp | 311 ++++++++++++ opencamcpp/opencam.desktop | 10 + yolov3.cfg | 789 +++++++++++++++++++++++++++++++ 15 files changed, 2041 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 coco.names create mode 100644 opencam/image.jpg create mode 100644 opencam/main.py create mode 100644 opencamcpp/CMakeLists.txt create mode 100644 opencamcpp/CMakePresets.json create mode 100644 opencamcpp/CMakeUserPresets.json create mode 100644 opencamcpp/build_appimage.sh create mode 100644 opencamcpp/build_opencv.sh create mode 100644 opencamcpp/icon.png create mode 100644 opencamcpp/icon.svg create mode 100644 opencamcpp/main.cpp create mode 100644 opencamcpp/opencam.desktop create mode 100644 yolov3.cfg diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7d2dec5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,63 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +.Python +.venv/ +venv/ +ENV/ + +# C++ build +build/ +out/ +*.o +*.obj +*.exe +*.dll +*.so +*.dylib + +# IDE +.vs/ +.vscode/ +.idea/ +*.swp +*.swo +*.user + +# AppImage specific +*.AppImage +AppDir/ + +# Large model files and datasets +*.weights +*.h5 +*.pt +*.onnx + +# Temporary files +*.log +*.tmp + +# Qt specific +*.pro.user +*.pro.user.* +*.qmake.stash +moc_*.cpp +qrc_*.cpp +ui_*.h + +# CMake +CMakeCache.txt +CMakeFiles/ +cmake_install.cmake +install_manifest.txt +compile_commands.json + +# OpenCV build artifacts +opencv/ +opencv_build/ + +# System specific +.DS_Store +Thumbs.db \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..7e8a056 --- /dev/null +++ b/README.md @@ -0,0 +1,115 @@ +# OpenCam + +Real-time object detection application using OpenCV and YOLO, with both Python and C++ implementations. + +## Features + +- Real-time object detection using YOLOv3 +- Support for multiple camera inputs +- GPU acceleration with CUDA (optional) +- Cross-platform support (Windows, Linux) +- Modern Qt-based user interface +- Portable Linux AppImage build support + +## Prerequisites + +### For C++ Version + +- CMake 3.16 or higher +- C++17 compatible compiler +- Qt 5.12 or higher +- OpenCV 4.x with CUDA support (optional) +- CUDA Toolkit 10.0 or higher (optional) + +### For Python Version + +- Python 3.8 or higher +- OpenCV-Python +- PyQt5 +- NumPy + +## Installation + +### Building from Source (C++) + +1. Clone the repository: +```bash +git clone https://github.com/yourusername/opencam.git +cd opencam/opencamcpp +``` + +2. Build OpenCV with CUDA (optional): +```bash +chmod +x build_opencv.sh +./build_opencv.sh +``` + +3. Build the application: +```bash +mkdir build && cd build +cmake .. +make -j$(nproc) +``` + +### Creating AppImage (Linux) + +1. Ensure all dependencies are installed: +```bash +sudo apt-get install cmake build-essential qt5-default libopencv-dev librsvg2-bin +``` + +2. Build the AppImage: +```bash +chmod +x build_appimage.sh +./build_appimage.sh +``` + +### Python Version Setup + +1. Create a virtual environment: +```bash +python -m venv .venv +source .venv/bin/activate # Linux +# or +.venv\Scripts\activate # Windows +``` + +2. Install dependencies: +```bash +pip install opencv-python pyqt5 numpy +``` + +## Usage + +### Running the C++ Version + +```bash +./opencam +``` + +### Running the Python Version + +```bash +python main.py +``` + +## Model Files + +The application requires YOLOv3 model files: +- `yolov3.weights` +- `yolov3.cfg` +- `coco.names` + +Download the weights file from: https://pjreddie.com/media/files/yolov3.weights + +## License + +[Your chosen license] + +## Contributing + +1. Fork the repository +2. Create your feature branch +3. Commit your changes +4. Push to the branch +5. Create a new Pull Request \ No newline at end of file diff --git a/coco.names b/coco.names new file mode 100644 index 0000000..ca76c80 --- /dev/null +++ b/coco.names @@ -0,0 +1,80 @@ +person +bicycle +car +motorbike +aeroplane +bus +train +truck +boat +traffic light +fire hydrant +stop sign +parking meter +bench +bird +cat +dog +horse +sheep +cow +elephant +bear +zebra +giraffe +backpack +umbrella +handbag +tie +suitcase +frisbee +skis +snowboard +sports ball +kite +baseball bat +baseball glove +skateboard +surfboard +tennis racket +bottle +wine glass +cup +fork +knife +spoon +bowl +banana +apple +sandwich +orange +broccoli +carrot +hot dog +pizza +donut +cake +chair +sofa +pottedplant +bed +diningtable +toilet +tvmonitor +laptop +mouse +remote +keyboard +cell phone +microwave +oven +toaster +sink +refrigerator +book +clock +vase +scissors +teddy bear +hair drier +toothbrush diff --git a/opencam/image.jpg b/opencam/image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..af8e0871a985c88cbd173e6ac5a6fd279815761a GIT binary patch literal 136093 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 0: # Only change if a valid camera is selected + self.camera_index = self.camera_select.itemData(index) + if self.cap is not None and self.cap.isOpened(): + self.stop_camera() + self.start_camera() + + def start_camera(self): + if self.cap is not None: + self.stop_camera() + + try: + self.cap = cv2.VideoCapture(self.camera_index, cv2.CAP_DSHOW) + if not self.cap.isOpened(): + QMessageBox.warning(self, "Error", f"Cannot open camera {self.camera_index}") + print(f"Error: Cannot open camera {self.camera_index}") + return + + # Set camera properties for better performance + self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) + self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) + self.cap.set(cv2.CAP_PROP_FPS, 30) + + self.timer.start(30) + print(f"Started camera {self.camera_index}") + + except Exception as e: + QMessageBox.critical(self, "Error", f"Error starting camera: {str(e)}") + print(f"Error starting camera: {str(e)}") + + def stop_camera(self): + if self.cap: + self.timer.stop() + self.cap.release() + self.cap = None + self.video_label.clear() + print("Camera stopped") + + def load_yolo(self): + # Download YOLO files if they don't exist + weights_path = "yolov3.weights" + config_path = "yolov3.cfg" + classes_path = "coco.names" + + if not all(os.path.exists(f) for f in [weights_path, config_path, classes_path]): + QMessageBox.information(self, "Download", "Downloading YOLO model files. This may take a moment...") + self.download_yolo_files() + + try: + self.net = cv2.dnn.readNet(weights_path, config_path) + with open(classes_path, "r") as f: + self.classes = [line.strip() for line in f.readlines()] + + layer_names = self.net.getLayerNames() + self.output_layers = [layer_names[i - 1] for i in self.net.getUnconnectedOutLayers()] + + print("YOLO model loaded successfully") + except Exception as e: + print(f"Error loading YOLO model: {str(e)}") + QMessageBox.warning(self, "Error", "Failed to load object detection model") + + def download_yolo_files(self): + files = { + "yolov3.weights": "https://pjreddie.com/media/files/yolov3.weights", + "yolov3.cfg": "https://raw.githubusercontent.com/pjreddie/darknet/master/cfg/yolov3.cfg", + "coco.names": "https://raw.githubusercontent.com/pjreddie/darknet/master/data/coco.names" + } + + progress_dialog = DownloadProgressBar(self) + progress_dialog.show() + + for file_name, url in files.items(): + if not os.path.exists(file_name): + print(f"Downloading {file_name}...") + progress_dialog.set_file_label(file_name) + try: + progress_handler = DownloadProgressHandler(progress_dialog) + urllib.request.urlretrieve( + url, + file_name, + reporthook=progress_handler.handle_progress + ) + print(f"Downloaded {file_name}") + except Exception as e: + print(f"Error downloading {file_name}: {str(e)}") + QMessageBox.critical(self, "Error", f"Failed to download {file_name}") + + progress_dialog.close() + + def detect_objects(self, frame): + if self.net is None or self.classes is None: + return frame + + height, width, _ = frame.shape + blob = cv2.dnn.blobFromImage(frame, 0.00392, (416, 416), (0, 0, 0), True, crop=False) + + self.net.setInput(blob) + outs = self.net.forward(self.output_layers) + + # Showing information on the screen + class_ids = [] + confidences = [] + boxes = [] + + # Showing information on the screen + for out in outs: + for detection in out: + scores = detection[5:] + class_id = np.argmax(scores) + confidence = scores[class_id] + if confidence > 0.5: + # Object detected + center_x = int(detection[0] * width) + center_y = int(detection[1] * height) + w = int(detection[2] * width) + h = int(detection[3] * height) + + # Rectangle coordinates + x = int(center_x - w / 2) + y = int(center_y - h / 2) + + boxes.append([x, y, w, h]) + confidences.append(float(confidence)) + class_ids.append(class_id) + + indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4) + + for i in range(len(boxes)): + if i in indexes: + x, y, w, h = boxes[i] + label = str(self.classes[class_ids[i]]) + confidence = confidences[i] + color = (0, 255, 0) # Green + cv2.rectangle(frame, (x, y), (x + w, y + h), color, 2) + cv2.putText(frame, f"{label} {confidence:.2f}", (x, y - 10), + cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2) + + return frame + + def update_frame(self): + if self.cap is None or not self.cap.isOpened(): + return + + ret, frame = self.cap.read() + if ret: + # Perform object detection + frame = self.detect_objects(frame) + + # Convert the frame from BGR to RGB + rgb_image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) + h, w, ch = rgb_image.shape + bytes_per_line = ch * w + + # Convert the frame to QImage + q_image = QImage(rgb_image.data, w, h, bytes_per_line, QImage.Format_RGB888) + + # Scale the image to fit the label while maintaining aspect ratio + scaled_pixmap = QPixmap.fromImage(q_image).scaled( + self.video_label.size(), + aspectRatioMode=1 # Qt.KeepAspectRatio + ) + self.video_label.setPixmap(scaled_pixmap) + else: + print("Failed to get frame from camera") + + def closeEvent(self, event): + self.stop_camera() + event.accept() + +if __name__ == "__main__": + app = QApplication(sys.argv) + window = CameraApp() + window.show() + sys.exit(app.exec_()) \ No newline at end of file diff --git a/opencamcpp/CMakeLists.txt b/opencamcpp/CMakeLists.txt new file mode 100644 index 0000000..2a13fdc --- /dev/null +++ b/opencamcpp/CMakeLists.txt @@ -0,0 +1,137 @@ +cmake_minimum_required(VERSION 3.16) +project(opencam LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) +set(CMAKE_AUTOUIC ON) + +# Add OpenCV directory to CMAKE_PREFIX_PATH +list(APPEND CMAKE_PREFIX_PATH "/usr/local") + +# Find Qt5 +find_package(Qt5 COMPONENTS + Core + Gui + Widgets + Network + REQUIRED +) + +# Find OpenCV +find_package(OpenCV REQUIRED) +message(STATUS "OpenCV version: ${OpenCV_VERSION}") +message(STATUS "OpenCV libraries: ${OpenCV_LIBS}") +message(STATUS "OpenCV include dirs: ${OpenCV_INCLUDE_DIRS}") + +# Check for CUDA support in OpenCV +if(";${OpenCV_LIBS};" MATCHES ";opencv_cudaimgproc;") + message(STATUS "OpenCV CUDA support found") + find_package(CUDA REQUIRED) + enable_language(CUDA) + set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS};-O3) + add_definitions(-DWITH_CUDA) + set(HAS_CUDA TRUE) +else() + message(STATUS "OpenCV was built without CUDA support. GPU acceleration will be disabled.") + set(HAS_CUDA FALSE) +endif() + +# Add source files +add_executable(${PROJECT_NAME} + main.cpp +) + +# Link libraries +target_link_libraries(${PROJECT_NAME} PRIVATE + Qt5::Core + Qt5::Gui + Qt5::Widgets + Qt5::Network + ${OpenCV_LIBS} +) + +if(HAS_CUDA) + target_link_libraries(${PROJECT_NAME} PRIVATE + ${CUDA_LIBRARIES} + ) +endif() + +# Include directories +target_include_directories(${PROJECT_NAME} PRIVATE + ${OpenCV_INCLUDE_DIRS} +) + +if(HAS_CUDA) + target_include_directories(${PROJECT_NAME} PRIVATE + ${CUDA_INCLUDE_DIRS} + ) +endif() + +# Installation rules +install(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION bin + COMPONENT applications +) + +# Function to safely install a library and its dependencies +function(install_library lib_path) + if(EXISTS "${lib_path}") + file(REAL_PATH "${lib_path}" real_path) + install(FILES "${real_path}" + DESTINATION lib + COMPONENT libraries + ) + + # Get library dependencies + execute_process( + COMMAND ldd "${real_path}" + OUTPUT_VARIABLE LDD_OUTPUT + ) + + # Extract and install dependencies + string(REGEX MATCHALL "/[^)]*\\.so[^)]*" DEPS "${LDD_OUTPUT}") + foreach(dep ${DEPS}) + if(EXISTS "${dep}" AND NOT "${dep}" MATCHES "^/lib" AND NOT "${dep}" MATCHES "^/usr/lib") + install(FILES "${dep}" + DESTINATION lib + COMPONENT libraries + ) + endif() + endforeach() + endif() +endfunction() + +# Install OpenCV libraries +foreach(lib ${OpenCV_LIBS}) + get_target_property(lib_location ${lib} LOCATION) + if(lib_location) + install_library("${lib_location}") + endif() +endforeach() + +# Install Qt plugins +if(Qt5_DIR) + file(GLOB_RECURSE QT_PLUGINS "${Qt5_DIR}/../../../plugins/*.so") + foreach(plugin ${QT_PLUGINS}) + get_filename_component(plugin_path "${plugin}" DIRECTORY) + get_filename_component(plugin_dir "${plugin_path}" NAME) + install(FILES "${plugin}" + DESTINATION plugins/${plugin_dir} + COMPONENT plugins + ) + endforeach() +endif() + +# Print configuration summary +message(STATUS "") +message(STATUS "Configuration Summary") +message(STATUS "--------------------") +message(STATUS "OpenCV version: ${OpenCV_VERSION}") +message(STATUS "CUDA support: ${HAS_CUDA}") +message(STATUS "Qt version: ${Qt5_VERSION}") +message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") +message(STATUS "C++ compiler: ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}") +message(STATUS "Installation prefix: ${CMAKE_INSTALL_PREFIX}") +message(STATUS "") \ No newline at end of file diff --git a/opencamcpp/CMakePresets.json b/opencamcpp/CMakePresets.json new file mode 100644 index 0000000..56c4ce3 --- /dev/null +++ b/opencamcpp/CMakePresets.json @@ -0,0 +1,22 @@ +{ + "version": 3, + "configurePresets": [ + { + "hidden": true, + "name": "Qt", + "cacheVariables": { + "CMAKE_PREFIX_PATH": "$env{QTDIR}" + }, + "vendor": { + "qt-project.org/Qt": { + "checksum": "wVa86FgEkvdCTVp1/nxvrkaemJc=" + } + } + } + ], + "vendor": { + "qt-project.org/Presets": { + "checksum": "67SmY24ZeVbebyKD0fGfIzb/bGI=" + } + } +} \ No newline at end of file diff --git a/opencamcpp/CMakeUserPresets.json b/opencamcpp/CMakeUserPresets.json new file mode 100644 index 0000000..4987168 --- /dev/null +++ b/opencamcpp/CMakeUserPresets.json @@ -0,0 +1,40 @@ +{ + "version": 3, + "configurePresets": [ + { + "name": "Qt-Debug", + "inherits": "Qt-Default", + "binaryDir": "${sourceDir}/out/build/debug", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_CXX_FLAGS": "-DQT_QML_DEBUG" + }, + "environment": { + "QML_DEBUG_ARGS": "-qmljsdebugger=file:{ff00bfed-29c2-47f8-b4aa-00b2873b1a26},block" + } + }, + { + "name": "Qt-Release", + "inherits": "Qt-Default", + "binaryDir": "${sourceDir}/out/build/release", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release" + } + }, + { + "hidden": true, + "name": "Qt-Default", + "inherits": null, + "vendor": { + "qt-project.org/Default": { + "checksum": "VoalogTkyWuFomeO1TLFx0olLJ4=" + } + } + } + ], + "vendor": { + "qt-project.org/Presets": { + "checksum": "azRZtZDqJVYwlIJYZufPfOYPwkE=" + } + } +} \ No newline at end of file diff --git a/opencamcpp/build_appimage.sh b/opencamcpp/build_appimage.sh new file mode 100644 index 0000000..daf4642 --- /dev/null +++ b/opencamcpp/build_appimage.sh @@ -0,0 +1,90 @@ +#!/bin/bash + +# Exit on error +set -e + +# Function to copy library and its dependencies +copy_dependencies() { + local binary="$1" + local target_dir="$2" + + # Create target directory if it doesn't exist + mkdir -p "$target_dir" + + # Get all dependencies + ldd "$binary" | while read -r line; do + # Extract the library path + if [[ $line =~ '=>' ]]; then + lib_path=$(echo "$line" | awk '{print $3}') + else + lib_path=$(echo "$line" | awk '{print $1}') + fi + + # Skip system libraries and non-existent files + if [[ -f "$lib_path" && ! "$lib_path" =~ ^/lib && ! "$lib_path" =~ ^/usr/lib ]]; then + cp -L "$lib_path" "$target_dir/" + fi + done +} + +# Create AppDir structure +mkdir -p AppDir/usr/{bin,lib,share/applications,share/icons/hicolor/256x256/apps} + +# Build the application +mkdir -p build +cd build +cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release +make -j$(nproc) + +# Install to AppDir +make DESTDIR=../AppDir install +cd .. + +# Copy desktop file and icon +cp opencam.desktop AppDir/usr/share/applications/ +cp icon.png AppDir/usr/share/icons/hicolor/256x256/apps/opencam.png + +# Copy Qt plugins +mkdir -p AppDir/usr/plugins +for plugin_dir in platforms imageformats xcbglintegrations; do + if [ -d "/usr/lib/x86_64-linux-gnu/qt5/plugins/$plugin_dir" ]; then + cp -r "/usr/lib/x86_64-linux-gnu/qt5/plugins/$plugin_dir" AppDir/usr/plugins/ + fi +done + +# Copy dependencies for the main executable +copy_dependencies "AppDir/usr/bin/opencam" "AppDir/usr/lib" + +# Copy dependencies for Qt plugins +find AppDir/usr/plugins -type f -name "*.so" | while read plugin; do + copy_dependencies "$plugin" "AppDir/usr/lib" +done + +# Create AppRun script +cat > AppDir/AppRun << 'EOF' +#!/bin/bash +HERE="$(dirname "$(readlink -f "${0}")")" +export LD_LIBRARY_PATH="${HERE}/usr/lib:${LD_LIBRARY_PATH}" +export QT_PLUGIN_PATH="${HERE}/usr/plugins" +export QT_QPA_PLATFORM_PLUGIN_PATH="${HERE}/usr/plugins/platforms" +exec "${HERE}/usr/bin/opencam" "$@" +EOF + +chmod +x AppDir/AppRun + +# Download linuxdeploy if not present +if [ ! -f linuxdeploy-x86_64.AppImage ]; then + wget https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage + chmod +x linuxdeploy-x86_64.AppImage +fi + +if [ ! -f linuxdeploy-plugin-qt-x86_64.AppImage ]; then + wget https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage + chmod +x linuxdeploy-plugin-qt-x86_64.AppImage +fi + +# Create the AppImage +export OUTPUT="OpenCam-x86_64.AppImage" +./linuxdeploy-x86_64.AppImage --appdir AppDir --plugin qt --output appimage + +echo "AppImage created successfully: $OUTPUT" \ No newline at end of file diff --git a/opencamcpp/build_opencv.sh b/opencamcpp/build_opencv.sh new file mode 100644 index 0000000..dda4802 --- /dev/null +++ b/opencamcpp/build_opencv.sh @@ -0,0 +1,83 @@ +#!/bin/bash + +# Exit on error +set -e + +# Function to check CUDA installation +check_cuda() { + if ! command -v nvcc &> /dev/null; then + echo "CUDA not found! Please install CUDA toolkit first." + exit 1 + fi + echo "Found CUDA installation: $(nvcc --version | head -n1)" +} + +# Function to check GPU +check_gpu() { + if ! command -v nvidia-smi &> /dev/null; then + echo "No NVIDIA GPU found or drivers not installed!" + exit 1 + fi + echo "Found GPU: $(nvidia-smi -L)" +} + +# Check CUDA and GPU +check_cuda +check_gpu + +# Get CUDA compute capability +CUDA_ARCH=$(nvidia-smi --query-gpu=compute_cap --format=csv,noheader) +echo "GPU Compute Capability: $CUDA_ARCH" + +# Create build directory +cd ~/opencv_build/opencv +mkdir -p build +cd build + +# Configure OpenCV build +cmake -D CMAKE_BUILD_TYPE=RELEASE \ + -D CMAKE_INSTALL_PREFIX=/usr/local \ + -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \ + -D WITH_CUDA=ON \ + -D WITH_CUDNN=OFF \ + -D OPENCV_DNN_CUDA=ON \ + -D ENABLE_FAST_MATH=1 \ + -D CUDA_FAST_MATH=1 \ + -D CUDA_ARCH_BIN=$CUDA_ARCH \ + -D WITH_CUBLAS=1 \ + -D WITH_TBB=ON \ + -D WITH_V4L=ON \ + -D WITH_QT=ON \ + -D WITH_OPENGL=ON \ + -D WITH_GSTREAMER=ON \ + -D OPENCV_GENERATE_PKGCONFIG=ON \ + -D OPENCV_PC_FILE_NAME=opencv.pc \ + -D OPENCV_ENABLE_NONFREE=ON \ + -D INSTALL_PYTHON_EXAMPLES=OFF \ + -D INSTALL_C_EXAMPLES=OFF \ + -D BUILD_EXAMPLES=OFF \ + -D BUILD_opencv_cudacodec=OFF \ + -D OPENCV_ENABLE_MEMALIGN=ON \ + -D WITH_OPENEXR=ON \ + -D OPENCV_ENABLE_MEMALIGN=ON \ + -D WITH_EIGEN=ON \ + -D ENABLE_PRECOMPILED_HEADERS=OFF \ + .. + +# Build using all available CPU cores +make -j$(nproc) + +# Install +sudo make install +sudo ldconfig + +# Print OpenCV installation information +echo "OpenCV installation completed!" +echo "OpenCV version: $(pkg-config --modversion opencv4)" +echo "Installation location: $(pkg-config --variable=prefix opencv4)" + +# Create a pkg-config path file +sudo sh -c 'echo "/usr/local/lib/pkgconfig" > /etc/ld.so.conf.d/opencv.conf' +sudo ldconfig + +echo "Setup complete! You can now use OpenCV with CUDA support." \ No newline at end of file diff --git a/opencamcpp/icon.png b/opencamcpp/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..15d1c3cca391a4e81aeb3b07d7454d465fa5d17f GIT binary patch literal 11737 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 literal 0 HcmV?d00001 diff --git a/opencamcpp/icon.svg b/opencamcpp/icon.svg new file mode 100644 index 0000000..7371bb1 --- /dev/null +++ b/opencamcpp/icon.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/opencamcpp/main.cpp b/opencamcpp/main.cpp new file mode 100644 index 0000000..eb0d3f0 --- /dev/null +++ b/opencamcpp/main.cpp @@ -0,0 +1,311 @@ +#include +#ifdef WITH_CUDA +#include +#include +#include +#include +#include +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class FrameProcessor : public QThread { + Q_OBJECT +public: + FrameProcessor(QObject* parent = nullptr) : QThread(parent), running(false) { + #ifdef WITH_CUDA + // Initialize CUDA device + cv::cuda::setDevice(0); + stream = cv::cuda::Stream(); + #endif + } + + void startProcessing() { + running = true; + if (!isRunning()) start(); + } + + void stopProcessing() { + running = false; + wait(); + } + + void setNet(cv::dnn::Net& net) { + std::lock_guard lock(netMutex); + this->net = net; + } + + void queueFrame(const cv::Mat& frame) { + std::lock_guard lock(queueMutex); + frameQueue.push(frame); + condition.notify_one(); + } + +signals: + void frameProcessed(QImage image); + +protected: + void run() override { + while (running) { + cv::Mat frame; + { + std::unique_lock lock(queueMutex); + condition.wait(lock, [this] { return !frameQueue.empty() || !running; }); + if (!running) break; + frame = frameQueue.front(); + frameQueue.pop(); + } + + if (frame.empty()) continue; + + #ifdef WITH_CUDA + // GPU processing path + cv::cuda::GpuMat gpuFrame; + gpuFrame.upload(frame, stream); + + cv::cuda::GpuMat gpuResized; + cv::cuda::resize(gpuFrame, gpuResized, cv::Size(416, 416), 0, 0, cv::INTER_CUBIC, stream); + + // Download for DNN processing (until we implement CUDA DNN) + cv::Mat resized; + gpuResized.download(resized, stream); + #else + // CPU processing path + cv::Mat resized; + cv::resize(frame, resized, cv::Size(416, 416), 0, 0, cv::INTER_CUBIC); + #endif + + // Object detection + cv::Mat blob; + cv::dnn::blobFromImage(resized, blob, 1/255.0, cv::Size(416, 416), cv::Scalar(0,0,0), true, false); + + { + std::lock_guard lock(netMutex); + net.setInput(blob); + std::vector outs; + net.forward(outs, net.getUnconnectedOutLayersNames()); + + std::vector classIds; + std::vector confidences; + std::vector boxes; + + for (const auto& out : outs) { + float* data = (float*)out.data; + for (int j = 0; j < out.rows; ++j, data += out.cols) { + cv::Mat scores = out.row(j).colRange(5, out.cols); + cv::Point classIdPoint; + double confidence; + cv::minMaxLoc(scores, 0, &confidence, 0, &classIdPoint); + + if (confidence > 0.5) { + int centerX = (int)(data[0] * frame.cols); + int centerY = (int)(data[1] * frame.rows); + int width = (int)(data[2] * frame.cols); + int height = (int)(data[3] * frame.rows); + int left = centerX - width / 2; + int top = centerY - height / 2; + + classIds.push_back(classIdPoint.x); + confidences.push_back((float)confidence); + boxes.push_back(cv::Rect(left, top, width, height)); + } + } + } + + std::vector indices; + cv::dnn::NMSBoxes(boxes, confidences, 0.5, 0.4, indices); + + for (size_t i = 0; i < indices.size(); ++i) { + int idx = indices[i]; + cv::Rect box = boxes[idx]; + cv::rectangle(frame, box, cv::Scalar(0, 255, 0), 2); + } + } + + #ifdef WITH_CUDA + // Convert to RGB on GPU + cv::cuda::GpuMat gpuRGB; + cv::cuda::cvtColor(gpuFrame, gpuRGB, cv::COLOR_BGR2RGB, 0, stream); + cv::Mat rgb; + gpuRGB.download(rgb, stream); + #else + // Convert to RGB on CPU + cv::Mat rgb; + cv::cvtColor(frame, rgb, cv::COLOR_BGR2RGB); + #endif + + // Convert to QImage + QImage qimg(rgb.data, rgb.cols, rgb.rows, rgb.step, QImage::Format_RGB888); + emit frameProcessed(qimg.copy()); + } + } + +private: + std::atomic running; + #ifdef WITH_CUDA + cv::cuda::Stream stream; + #endif + cv::dnn::Net net; + std::queue frameQueue; + std::mutex queueMutex; + std::mutex netMutex; + std::condition_variable condition; +}; + +class CameraApp : public QMainWindow { + Q_OBJECT +public: + CameraApp(QWidget* parent = nullptr) : QMainWindow(parent) { + setWindowTitle("GPU-Accelerated Object Detection"); + setGeometry(100, 100, 1280, 720); + + #ifdef WITH_CUDA + // Check CUDA device + int deviceCount = cv::cuda::getCudaEnabledDeviceCount(); + if (deviceCount == 0) { + QMessageBox::warning(this, "Warning", "No CUDA capable devices found. Falling back to CPU processing."); + } else { + cv::cuda::printCudaDeviceInfo(0); + } + #endif + + setupUI(); + initializeObjectDetection(); + processor = new FrameProcessor(this); + connect(processor, &FrameProcessor::frameProcessed, this, &CameraApp::updateFrame); + } + + ~CameraApp() { + stopCamera(); + if (processor) { + processor->stopProcessing(); + delete processor; + } + } + +private slots: + void startCamera() { + if (!cap.isOpened()) { + cap.open(currentCamera); + cap.set(cv::CAP_PROP_FRAME_WIDTH, 1920); + cap.set(cv::CAP_PROP_FRAME_HEIGHT, 1080); + cap.set(cv::CAP_PROP_FPS, 120); // Request maximum FPS + + #ifdef WITH_CUDA + // Try to use CUDA video decoder if available + cap.set(cv::CAP_PROP_CUDA_DEVICE, 0); + #endif + + if (!cap.isOpened()) { + QMessageBox::critical(this, "Error", "Failed to open camera!"); + return; + } + } + + processor->startProcessing(); + timer->start(0); // Run as fast as possible + } + + void stopCamera() { + timer->stop(); + processor->stopProcessing(); + if (cap.isOpened()) { + cap.release(); + } + } + + void captureFrame() { + if (!cap.isOpened()) return; + + cv::Mat frame; + cap >> frame; + if (frame.empty()) return; + + processor->queueFrame(frame); + } + + void updateFrame(const QImage& image) { + QPixmap pixmap = QPixmap::fromImage(image); + videoLabel->setPixmap(pixmap.scaled(videoLabel->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation)); + } + +private: + void setupUI() { + QWidget* centralWidget = new QWidget(this); + setCentralWidget(centralWidget); + QVBoxLayout* layout = new QVBoxLayout(centralWidget); + + videoLabel = new QLabel(this); + videoLabel->setMinimumSize(640, 480); + layout->addWidget(videoLabel); + + cameraSelect = new QComboBox(this); + detectCameras(); + layout->addWidget(cameraSelect); + + startButton = new QPushButton("Start Camera", this); + connect(startButton, &QPushButton::clicked, this, &CameraApp::startCamera); + layout->addWidget(startButton); + + stopButton = new QPushButton("Stop Camera", this); + connect(stopButton, &QPushButton::clicked, this, &CameraApp::stopCamera); + layout->addWidget(stopButton); + + timer = new QTimer(this); + connect(timer, &QTimer::timeout, this, &CameraApp::captureFrame); + } + + void detectCameras() { + for (int i = 0; i < 10; ++i) { + cv::VideoCapture temp(i); + if (temp.isOpened()) { + cameraSelect->addItem("Camera " + QString::number(i), i); + temp.release(); + } + } + } + + void initializeObjectDetection() { + // Download and load YOLO model (implementation similar to Python version) + // ... + } + + QLabel* videoLabel; + QComboBox* cameraSelect; + QPushButton* startButton; + QPushButton* stopButton; + QTimer* timer; + cv::VideoCapture cap; + int currentCamera = 0; + FrameProcessor* processor; +}; + +#include "main.moc" + +int main(int argc, char* argv[]) { + QApplication app(argc, argv); + CameraApp window; + window.show(); + return app.exec(); +} \ No newline at end of file diff --git a/opencamcpp/opencam.desktop b/opencamcpp/opencam.desktop new file mode 100644 index 0000000..a136032 --- /dev/null +++ b/opencamcpp/opencam.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Type=Application +Name=OpenCam +Comment=Real-time object detection using OpenCV and YOLO +Exec=opencam +Icon=opencam +Categories=Graphics;Video; +Keywords=camera;detection;opencv;yolo; +Terminal=false +StartupNotify=true \ No newline at end of file diff --git a/yolov3.cfg b/yolov3.cfg new file mode 100644 index 0000000..938ffff --- /dev/null +++ b/yolov3.cfg @@ -0,0 +1,789 @@ +[net] +# Testing +# batch=1 +# subdivisions=1 +# Training +batch=64 +subdivisions=16 +width=608 +height=608 +channels=3 +momentum=0.9 +decay=0.0005 +angle=0 +saturation = 1.5 +exposure = 1.5 +hue=.1 + +learning_rate=0.001 +burn_in=1000 +max_batches = 500200 +policy=steps +steps=400000,450000 +scales=.1,.1 + +[convolutional] +batch_normalize=1 +filters=32 +size=3 +stride=1 +pad=1 +activation=leaky + +# Downsample + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=32 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +# Downsample + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=64 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +# Downsample + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +# Downsample + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +# Downsample + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=2 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=1024 +size=3 +stride=1 +pad=1 +activation=leaky + +[shortcut] +from=-3 +activation=linear + +###################### + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=1024 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=1024 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=512 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=1024 +activation=leaky + +[convolutional] +size=1 +stride=1 +pad=1 +filters=255 +activation=linear + + +[yolo] +mask = 6,7,8 +anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 +classes=80 +num=9 +jitter=.3 +ignore_thresh = .7 +truth_thresh = 1 +random=1 + + +[route] +layers = -4 + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[upsample] +stride=2 + +[route] +layers = -1, 61 + + + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=512 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=512 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=256 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=512 +activation=leaky + +[convolutional] +size=1 +stride=1 +pad=1 +filters=255 +activation=linear + + +[yolo] +mask = 3,4,5 +anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 +classes=80 +num=9 +jitter=.3 +ignore_thresh = .7 +truth_thresh = 1 +random=1 + + + +[route] +layers = -4 + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[upsample] +stride=2 + +[route] +layers = -1, 36 + + + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=256 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=256 +activation=leaky + +[convolutional] +batch_normalize=1 +filters=128 +size=1 +stride=1 +pad=1 +activation=leaky + +[convolutional] +batch_normalize=1 +size=3 +stride=1 +pad=1 +filters=256 +activation=leaky + +[convolutional] +size=1 +stride=1 +pad=1 +filters=255 +activation=linear + + +[yolo] +mask = 0,1,2 +anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 +classes=80 +num=9 +jitter=.3 +ignore_thresh = .7 +truth_thresh = 1 +random=1 +