| What | '''Tcl-opencv''' | | Where | https://github.com/ray2501/tcl-opencv | | Description | Tcl-opencv is a Tcl extension for [https://opencv.org/%|%OpenCV] (Open Source Computer Vision Library). It is a library of programming functions mainly aimed at real-time computer vision. This extension requires OpenCV 4.5.0 or newer. | | Current Release| '''0.13''' | | License | MIT License | | Who | Danilo Chang | tcl-opencv is available with the [https://www.androwish.org/home/tree?name=undroid/tcl-opencv%|%undroid] distribution. Here is a little snippet using the [v4l2] (Video For Linux 2) extension with both a webcam and a loopback device and the [tcl-opencv] extension for image processing. The example is a rough translation of the "Cartoonizer" in chapter 1 of the book "Mastering OpenCV with Practical Computer Vision Projects". The resulting image is output into a photo image / label widget and to a [v4l2] loopback device in order to allow e.g. Firefox to use the processed image stream in video conferencing. ====== # Cartoonifier with OpenCV and v4l2 loopback device package require v4l2 package require opencv # "cv::matvar" is like set but with implicit cleanup using traces namespace eval cv { namespace export matvar } namespace import cv::matvar # Labels with images to see what's going on image create photo CAM label .img -image CAM pack .img -side left image create photo OUT label .out -image OUT pack .out -side left # Some controls for the Cartoonifier. scale .blur -orient vertical -from 1 -to 17 -resolution 2 -variable BLUR pack .blur -side left scale .lap1 -orient vertical -from 1 -to 9 -resolution 2 -variable LAP1 pack .lap1 -side left scale .lap2 -orient vertical -from 1 -to 9 -resolution 2 -variable LAP2 pack .lap2 -side left scale .bf1 -orient vertical -from 1 -to 10 -resolution 1 -variable BF1 pack .bf1 -side left scale .bf2 -orient vertical -from 1 -to 10 -resolution 1 -variable BF2 pack .bf2 -side left scale .bf3 -orient vertical -from 1 -to 10 -resolution 1 -variable BF3 pack .bf3 -side left set BLUR 9 set LAP1 5 set LAP2 1 set BF1 9 set BF2 9 set BF3 7 # Setup loopback device, use YUV here since jitsi.org in FireFox does not support RGB. v4l2 loopback /dev/video2 YUYV 320 240 25 # Open loopback device for later writes set LOOP [v4l2 open /dev/video2 #no-image-callback] # Callback: image ready or error. proc image_callback {dev ind} { if {$ind eq "error"} { puts stderr "acquisition error, exiting" exit } if {[catch {v4l2 image $dev CAM} err]} { puts stderr $err } else { after cancel image_processing after idle image_processing } } # For original camera image and processed (output) image. matvar matcam [cv::Mat::Mat 320 240 $::cv::CV_8UC3] matvar matout [cv::Mat::Mat 320 240 $::cv::CV_8UC3] # Cartoonifier from chapter 1 of "Mastering OpenCV with Practical Computer Vision Projects" proc image_processing {} { $::matcam fromPhoto CAM matvar mat1 [cv::cvtColor $::matcam $::cv::COLOR_BGR2GRAY] matvar mat0 [cv::medianBlur $mat1 $::BLUR] matvar mat1 [cv::Laplacian $mat0 $::LAP1 $::LAP2 0 $::cv::BORDER_DEFAULT] matvar matmask [cv::threshold $mat1 80 255 $::cv::THRESH_BINARY_INV] matvar mat0 [cv::resize $::matcam 160 120] for {set i 0} {$i < 5} {incr i} { matvar mat1 [cv::bilateralFilter $mat0 $::BF1 $::BF2 $::BF3] matvar mat0 [cv::bilateralFilter $mat1 $::BF1 $::BF2 $::BF3] } matvar mat1 [cv::resize $mat0 320 240] $::matout setTo {0 0 0 0} $mat1 copyTo $::matout $matmask $::matout toPhoto OUT v4l2 writephoto $::LOOP OUT } # Initialize camera using 320x240 which make enough load on my core i5. proc init_camera {} { set name /dev/video0 set dev [v4l2 open $name image_callback] v4l2 parameters $dev frame-rate 10 frame-size 320x240@MJPG v4l2 parameters $dev saturation 100 v4l2 start $dev } init_camera ======