From f8d889e1f82e78dea68a6e8e395d9149cdcf3102 Mon Sep 17 00:00:00 2001
From: am0ebe <am0ebe@gmx.de>
Date: Wed, 31 Jan 2024 17:54:38 +0100
Subject: [PATCH] sort/update notes/todo and add link to cmds.cpp for quick
 rehash of c++ syntax/snippets

---
 b                           |   2 +-
 dox/cmds.cpp                |   1 +
 dox/notes                   | 230 ------------------------------------
 dox/notes_A                 |   5 +
 dox/notes_B                 |  79 ++++++++++++-
 dox/notes_C                 |   4 +-
 dox/timeplan-milestones.ods | Bin 21804 -> 22633 bytes
 dox/todo_ct                 | 129 ++++++++------------
 8 files changed, 134 insertions(+), 316 deletions(-)
 create mode 120000 dox/cmds.cpp

diff --git a/b b/b
index b819b9b..a6d5b19 160000
--- a/b
+++ b/b
@@ -1 +1 @@
-Subproject commit b819b9b8792adc4b207fb1a01855dbb2ac25e4a0
+Subproject commit a6d5b193aa6c6d525828e9de7677701f3e4b1252
diff --git a/dox/cmds.cpp b/dox/cmds.cpp
new file mode 120000
index 0000000..fcee972
--- /dev/null
+++ b/dox/cmds.cpp
@@ -0,0 +1 @@
+/home/sugu/dox/cmds/cmds.cpp
\ No newline at end of file
diff --git a/dox/notes b/dox/notes
index bdede4a..d8b610e 100644
--- a/dox/notes
+++ b/dox/notes
@@ -15,239 +15,9 @@ get feedback (occassionaly)
 ## Software A - Frame grab - recorder - ctb
 #############################################################
 
-# setup Vimba
-	> see Vimba_installation_under_Linux.pdf
-	> download and unpack Vimba SDK
-	> tar -xzf ./Vimba.tgz
-	> sudo ./VimbaGigETL/Install.sh
 
-## SETUP GT1920C:
-> connect lap and cam directly via ethernet
-> set MTU to 8228 (jumbo frames/packets)
-> set fixed IP for eth-adapter first and then cam (use Vimbaviewer -> force IP)
-	eth 169.254.100.1
-	cam 169.254.x.x # on restart will pick random IP...
 
-	mac
-		000f310338D3
-		000f310338D4
-	sub 255.255.0.0
-  (gat 0.0.0.0 local / none)
-	-> ip address of each adapter needs to be on a unique subnet
-	-> for multiple cams calc bandwith and use switch
 
-# What bandwidth do i have? Do i need multiple ports?
-bandwith = fps * pixel format(bpp) * resolution (* ncams)
-StreamBytesPerSecond = 17 * 3 * 1936 * 1216 * 1 = 8 456 448 ~= 8,4 MBps < 125MBps
-
-	1. Determine max_speed with highest fps!
-	2. Take max_speed and reduce fps so it still fits 2*max_speed
-		-> subsample same video ?
-	3. calc mean_err through comparing 1. and 2. -> add to 2. as it will be lower.
-
-	!! exposure and fps: on 10fps exposure can't be more then 100ms!
-	!! exposure and fps: on 17fps exposure can't be more then 59ms!
-	Best practice: set gain to lowest possible val and increase exposure as needed
-	!! if you use more than one cam on one interface, the available bandwidth has to be shared between interfaces.
-
-###############################
-# bandwidth calculations for Alvium G1 240C
-MAX BANDWITH for Gigabit ethernet port ~= 125 Mbps
-max res: 1936x1216
-max fps: 49
-pixelformat: RGB8  > different options. eg 10bit/12bit RGB/MONO.
-	1936 * 1216 * 49 * 1 ~= 115,3 MBps >> MONO8 @ maxFPS
-	1936 * 1216 * 17 * 1 ~= 40,0 MBps >> MONO8 @ 17FPS
-		@ 1 Min -> 2.4GB
-		@ 30 Mins -> 144GB
-		with 60 recordings: 8.6TB
-	1936 * 1216 * 17 * 3 ~= 120,1 MBps >> RGB8 @ 17FPS
-		@ 1 Min -> 7.2GB
-		@ 30 Mins -> 216.1GB
-		with 60 recordings: 13 TB
-
-	1936 * 1216 * 10 * 3 ~= 70,6 MBps
-		@ 1 Min -> 4.2 GB
-		@ 30 Mins -> 127.1 GB
-		with 60 recordings: 7.6TB
-
-Storage old ws:
-	2TB: 2*1TB (7200RPM = 6GB/s)
-	8Gb DDR3 RAM
-	Intel Xeon 3.6Ghz (4 cores)
-
-	default bandwidth:115MBps
--------------------------------
-Save "reasonable" settings in XML.
-If dark, set ExposureTimeAbs
-Q: how to set fps to 3?
-
-
-#####################################
-## Background Substraction - BGS
-####################################
-
-
-#define bgs_register(x) static BGS_Register<x> register_##x(quote(x))
-## >> glue together macro?
-quote() adds ""
-
-bgs_register(Tapter)
->> static BGS_Register<Tapter> register_Tapter("Tapter")
-
-/usr/include/opencv4/opencv2/opencv.hpp
-PCA?
-
-
-> difference
-	virtual();
-	virtual(){ /*empty*/ }
-	virtual() = 0; #pure virtual
-
-> also difference
-	> virtual dtor(): if pointer to base-class deletes object
-	> pure virtual dtor(): need to also define function body, cuz dtor is special function whis is not overriden
-	> interface class (needs pure virtual??)
-	> abc - abstract base class. can't be instantiated anymore
-	> abc <> interface?
-
-
-	// IplImage is oldskool mat and not supported anymore..
-
-	> use smartpointer like so:
-	auto videoAnalysis = std::make_unique<VideoAnalysis>();
- 		videoCapture = std::make_unique<VideoCapture>();
-      	frameProcessor = std::make_shared<FrameProcessor>();
-
-
-## libarchive stuff
-###############################
-	archive_read_xxx()
-	archive_write_xxx()
-	struct archive_entry
-
-huge workaround for corrupted files
-clock
-random
-command arg parser
-
-
-
-???
-#if CV_MAJOR_VERSION > 3 || (CV_MAJOR_VERSION == 3 && CV_SUBMINOR_VERSION >= 9)
-  IplImage _frame = cvIplImage(img_input);
-  frame = &_frame;
-#else
-  frame = new IplImage(img_input);
-#endif
-
-#smartpointer??
-#elif CV_MAJOR_VERSION >= 3
-      cv::Ptr<cv::BackgroundSubtractorMOG2> mog;
-#endif
-
-###############################
-WS / VM
-		> 8 cores, 16GB RAM, 2 TB for 1cam
-		> 48 cores, 128GB RAM, 6 TB for 6cam
-###############################
-
-> What Tboy do... why did he do it?
-	> forked branch bgslib_qtgui_2.0.0
-	> Tapter
-			> adapter for model
-			> was probably copied from LBAdaptiveSOM.cpp
-		--> which is disabled in openCV4
-
-
-Which Background Subtraction Algo to use??
-	median, mean, framedifference
-		+ simple, fast,
-		- not robust if light/bg changes
-		- slow changes ?
-	> adaptive bg?
-	fuzzy?
-	mixture
-
-
-NAMES
-	Kernel?
-	LBSP?
-	Multilayer?
-	Sigma-Delta?
-	Vibe, T2F ,dp ,lb ,vumeter?
-	choquet, sugeno, zivkovic, pratimediod, LOBSTER
-
-Test/Use most common >> Ground Truth
-	Frame Difference
-	WeightedMovingMean / Variance
-	LBAdaptiveSOM
-	MOG2 (Mixture Of Gaussian) MixtureOfGaussianV2.h
-	KNN (K Nearest Neighbour)
-		> fast for small fg obj
-		> TRY!
-	FuzzySugenoIntegral.h
-
-	LSBP - Local Binary Similarity Patterns - (2013)
-	LSBP-based GSoC ?
-	SuBSENSE: improved spatiotemporal LBSP + color features (2014)
-
-	Combineable with
-		ROI
-		Canny Edge Detection
-
-
-> bg modeling to update BG (eg moving trees) > pixel with threshold
-> optic flow (camera is also moving. ) > vectoral estimation of own movement
-
-
-features
-	edge
-		canny edge detector + calc contour
-		> https://en.wikipedia.org/wiki/Canny_edge_detector
-	roi
-		crop
-	color
-		RGB - not so robust by itself (sensitive to illumination, shadows, oscillations ...)
-		YUV
-		YCrCb - brightness, chroma, color
-	texture
-		robust to illumination and shadow
-		eg Local Binary Pattern (LBP)
-
-https://github.com/murari023/awesome-background-subtraction (2021 new stuff!)
-
-https://learnopencv.com/background-subtraction-with-opencv-and-bgs-libraries/
-http://docs.opencv.org/2.4/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.html
-https://hackthedeveloper.com/background-subtraction-opencv-python/ #mog2 + knn in python
-https://docs.opencv.org/4.3.0/d4/dd5/classcv_1_1bgsegm_1_1BackgroundSubtractorGSOC.html#details #GSOC LSBP ALGO from openCV bgsegm.hpp
-
-https://openaccess.thecvf.com/content_cvpr_workshops_2014/W12/papers/St-Charles_Flexible_Background_Subtraction_2014_CVPR_paper.pdf
-https://www.scitepress.org/Papers/2018/66296/66296.pdf #vehicle tracking latvia. 2018, BackgroundSubtractorMOG, BackgroundSubtractorMOG2 (zivkovic)
-https://www-sop.inria.fr/members/Francois.Bremond/Postscript/AnhTuanAVSS14.pdf  2014
-https://arxiv.org/pdf/1803.07985.pdf # visual animal tracking (2018)
-https://arxiv.org/pdf/1507.06821.pdf # Multimodal Deep Learning for Robust RGB-D Object Recognition (2015)
-https://towardsdatascience.com/background-removal-with-deep-learning-c4f2104b3157?gi=2ef3a5272e5d (2017 Background removal with deep learning)
-
-https://opencv.org/courses/ #xpensive ai course
-https://www.fast.ai/ #free ai course
-
-Build with Python or C++?
-
-
-##################
-# computervision #
-##################
-background subtraction (bgs)
-segmentation
-	Semantic Segmentation (ai)
-detection (feature, object)
-classification (category recognition)
-
-Challenges: Occlusion, (Sensor-)Noise, changing external conditions( lighting, Shadows, fog, reflection )
-
-> pre-training if lack of data
-> corrupt data to guarantee robust learning
 
 
 
diff --git a/dox/notes_A b/dox/notes_A
index b9614b0..6f86d37 100644
--- a/dox/notes_A
+++ b/dox/notes_A
@@ -106,3 +106,8 @@ Prosilica GX:
 			> give name connect inet
 			--> as terminal to connect to server
 			--> later: use for DMX lighting
+
+
+# WS / VM
+		> 8 cores, 16GB RAM, 2 TB for 1cam
+		> 48 cores, 128GB RAM, 6 TB for 6cam
diff --git a/dox/notes_B b/dox/notes_B
index b52b7e2..f1074a5 100644
--- a/dox/notes_B
+++ b/dox/notes_B
@@ -16,6 +16,17 @@ map cam -> MAC -> IP -> name (contains ID)
 	camtron4 000A471D2A66 172.18.227.213 allied-alviumg1-240c-04ytm.idiv.de
 	camtron5 000A471D208D 172.18.225.129 allied-alviumg1-240c-04ytt.idiv.de
 	camtron6 000A47139EA6 172.18.227.215 allied-alviumg1-240c-04ytv.idiv.de
+		direct: 169.254.75.147
+
+
+camtron1///
+	169.254.158.10
+	fixed ip: 172.18.205.201 + 255.255.255.0
+	gateway should: 172.18.205.254
+	gateway is: 0.0.0.0
+
+wired settings
+169.254.100.3 255.255.0.0
 
 ## connect VM + setup ssh
 ssh kr69sugu@idivtibcam01.usr.idiv.de
@@ -34,7 +45,7 @@ ssh kr69sugu@idivtibcam01.usr.idiv.de
 		IMWRITE_JPEG_QUALITY 100; IMWRITE_JPEG_OPTIMIZE 1; IMWRITE_JPEG_RST_INTERVAL 4;
 
 
-# build/setup VimbaX
+## setup VimbaX
 	> download from https://www.alliedvision.com/en/products/software/vimba-x-sdk/
 	> see Vimba_installation_under_Linux.pdf
 	> unpack Vimba SDK
@@ -120,6 +131,23 @@ frames = img data + ancillaryData
 GenICam - camera standard
 TL - Transport Layer - transports data from cam to sw
 
+# DeviceTemperatureSelector get temp of cam!
+TimestampLatch
+TimestampReset
+TimestampLatchValue
+
+Statistics (sub cat)
+	StatFrameRate
+	StatFramesDelivered
+	StatFramesDropped
+	...
+
+[UserSetSelector]
+UserSetLoad
+UserSetSave
+
+CurrentIPAddress
+
 
 Buffer management
 ###############################
@@ -296,3 +324,52 @@ EventCameraDiscovery -> listen to find plugged cams
 		17x1936x1456=47mio -> 17fps @ full res
 		suggested CPU i7 3840
 		reduce ROI
+
+
+# What bandwidth do i have? Do i need multiple ports?
+###############################
+bandwith = fps * pixel format(bpp) * resolution (* ncams)
+StreamBytesPerSecond = 17 * 3 * 1936 * 1216 * 1 = 8 456 448 ~= 8,4 MBps < 125MBps
+
+	1. Determine max_speed with highest fps!
+	2. Take max_speed and reduce fps so it still fits 2*max_speed
+		-> subsample same video ?
+	3. calc mean_err through comparing 1. and 2. -> add to 2. as it will be lower.
+
+	!! exposure and fps: on 10fps exposure can't be more then 100ms!
+	!! exposure and fps: on 17fps exposure can't be more then 59ms!
+	Best practice: set gain to lowest possible val and increase exposure as needed
+	!! if you use more than one cam on one interface, the available bandwidth has to be shared between interfaces.
+
+###############################
+# bandwidth calculations for Alvium G1 240C
+MAX BANDWITH for Gigabit ethernet port ~= 125 Mbps
+max res: 1936x1216
+max fps: 49
+pixelformat: RGB8  > different options. eg 10bit/12bit RGB/MONO.
+	1936 * 1216 * 49 * 1 ~= 115,3 MBps >> MONO8 @ maxFPS
+	1936 * 1216 * 17 * 1 ~= 40,0 MBps >> MONO8 @ 17FPS
+		@ 1 Min -> 2.4GB
+		@ 30 Mins -> 144GB
+		with 60 recordings: 8.6TB
+	1936 * 1216 * 17 * 3 ~= 120,1 MBps >> RGB8 @ 17FPS
+		@ 1 Min -> 7.2GB
+		@ 30 Mins -> 216.1GB
+		with 60 recordings: 13 TB
+
+	1936 * 1216 * 10 * 3 ~= 70,6 MBps
+		@ 1 Min -> 4.2 GB
+		@ 30 Mins -> 127.1 GB
+		with 60 recordings: 7.6TB
+
+Storage old ws:
+	2TB: 2*1TB (7200RPM = 6GB/s)
+	8Gb DDR3 RAM
+	Intel Xeon 3.6Ghz (4 cores)
+
+	default bandwidth:115MBps
+-------------------------------
+Save "reasonable" settings in XML.
+If dark, set ExposureTimeAbs
+Q: how to set fps to 3?
+###############################
diff --git a/dox/notes_C b/dox/notes_C
index 773a16a..1ebb5f3 100644
--- a/dox/notes_C
+++ b/dox/notes_C
@@ -4,7 +4,7 @@
 git@gitlab.idiv.de:sugu/camtron.git
 
 Does
-	> background subtraction
+	> background subtraction // bgs
 	> calculates centroid points of all frames in a record
 ###############################
 
@@ -39,8 +39,8 @@ PCA?
       	frameProcessor = std::make_shared<FrameProcessor>();
 
 
+## libarchive stuff
 ###########
-libarchive stuff
 	archive_read_xxx()
 	archive_write_xxx()
 	struct archive_entry
diff --git a/dox/timeplan-milestones.ods b/dox/timeplan-milestones.ods
index f6177144252286938371e5018a87c4f4c0619189..af243d44fd0f261616d34b706e7bf70aa9c71c3c 100644
GIT binary patch
delta 10479
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
Tdpj31J20BYN0<w>zpVcQYre4P

delta 9634
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
Te^wU+0{?l<|G=tM{?h&jHU8^(

diff --git a/dox/todo_ct b/dox/todo_ct
index bff9bf6..2c62887 100644
--- a/dox/todo_ct
+++ b/dox/todo_ct
@@ -8,9 +8,9 @@ CAMTRON PROCESSING PIPELINE
 ###########################
 "tackle long-term complex projects from beginning to end"
 
-- keep up new work habit - consistently work 20-30 hw⁻¹
-- use copilot more efficiently
-- ‼️cam work with VM? (MTU)
+- ⏲️
+- 🗣️  sebastian hostname-fix IP
+- ‼️ cam works with VM?
 	read docu, write alliedvision
 	-- if yes.
 		test (VV)
@@ -18,10 +18,10 @@ CAMTRON PROCESSING PIPELINE
 	-- if no
 		- communicate w sebastian 1rst.
 		- communicate w uli
-- ‼️HPC. store some data. delete rest.
-	- write mail XX
-	- write joerdis
-- ‼️ mv big ct-data to hdd
+- ‼️  HPC. store some data 2018/2019 + vids. delete rest. write HPC guy
+- ‼️  mv big ct-data to hdd
+- use copilot more efficiently
+	- read Tuts, configure
 
 
 
@@ -34,42 +34,31 @@ B) recorder - camera produces frames and timestamps
 	- wait and detect cams
 	- ‼️ produce frames & timestamps
 ============================
-	- new architecture: console app (later: gui app) + Core.
-	CONSOLE APP:
-		in extra thread to not block main thread!
-		listen to user keys
-
-	CORE APP
-			functions / args:
-			- out_dir:
-				 parse dir arg and create it if it doesnt exist >- finish it / with proper user in/	output >- or cancel if it doesnt exist
-				 	>> EASIER: + no userinput which could complicate GUI app later...
-			- list cameras:
-			- store/load cam settings
-			- calibrate
-			- record
-			- stop recording
-		- consider using app settings in a json-file / QSettings
-			- cam mappings (IP/MAC/ID)
-			- out_dir
-
-	GUI APP:
-		- build GUI
-		- ... parse output for -LISTCAMERAS- and put into tablewidget
+	CORE
+		- list cameras
+			- test: core::listCams worx with multiple cams?
+
+		- store/load cam settings
+		- calibrate
+			- see ada - HPC - CALI SW
+		- record
+		- stop recording
+	- consider using app settings in a json-file / QSettings
+		- cam mappings (IP/MAC/ID)
+		- out_dir
+
+	CONSOLE
+		- print: convert '\n' to linebreaks
+		-
 
 ===============================
-	- get pix, using
+	- get pix, using VV and recorder
 		- laptop - direct connection
 		- laptop - local network
 		- virtual machine
 	- get video via vimbax-SDK
-	- cam calibration (Use Viewer? Or own SW?)
-	- configure cam settings
-	* get video for 3 cams simultaneously
-		- what SW?
-		- calculate supported framerate+resolution+codec for hardware (CPU,RAM,HDD...)
-			- or do tests and see if frames are dropped
-
+	- get video for 3 cams simultaneously
+	- do tests and see if frames are dropped
 	- central config
 		- threads for started recordings [PID]
 		- storage folder
@@ -80,13 +69,13 @@ B) recorder - camera produces frames and timestamps
 
 A)
 ###########################
-	- VM
-	- light
+	- test vm, else buy ws!
+	- !! light
 		- 2*LEDs: 1*day + 1*night
 		- find ecolux hw (Boxes, DMX per unit, DMX splitter/controller)
-	- arenas
+	- !! arenas
 		- Acrylzylinder in 2 teile gesaegt.
-	- floor
+	- floor ?
 		- gips+color+lack..
 
 
@@ -132,6 +121,12 @@ X) HPC - High Performance Cluster
 
 BACK-BURNER 2D
 ###############################
+ctb
+- GUI APP:
+	- build GUI
+	- ... parse output for -LISTCAMERAS- and put into tablewidget
+- calculate supported framerate+resolution+codec for hardware (CPU,RAM,HDD...)
+
 - Documentation
 	- sketch
 		- chamber: cam height+resolution+arena diameter for pixel to cm/mm ratio
@@ -147,49 +142,19 @@ BACK-BURNER 2D
 
 Done
 #######################
-- started working 20-26 hw⁻¹ for 3 weeks now :)
-	- habit. consistency!
-- started writing C++ again (+bash,+python)
-	- setup IDE (LSP plugins), QT, codecompletion
-	- get copilot
+- print and printlist()
+- integrate versionstring in new arch
+- mark current cam [*] <-- selected. others []
+- write allied: submax MTU shouldnt be a huge performance hit!
+- write mail HPC guy
+- write joerdis
+- list 1 cam and send to console via signal-slots
+- version
+- setup IDE (LSP plugins), QT, codecompletion
+- get copilot
 - automate + fix backup script
 - get VM
-- got pictures, tested all 6 cams :)
+- direct VV: got pictures, tested all 6 cams :)
 - bup old camtrack
 - start implementing new arch
 	- console app. thread. signal-slot connections.
-- backup old tibcamtrack VM
-- get video in VV
-- connect VM. ssh and rdp
-- sort ct a bit:
-	- folders, files, ... naming convention
-	- README + Description
-	- merge doc?
-	- b) exclude SDK / examples from repo
-- attach cam arm to wood (DONE)
-- test run 1 cam to estimate hw requirements
-	- test bottleneck (CPU,HDD,ethernet,)
-	- storage: 10s hochrechnen
-		- mit 25/17/10 FPS.
-		- different compression types
-
-- research suitable "fridges"
-	-- price!, temp-range, electricity inside, size space in lab?
-	-- more than 2
-		Reach In Plant Growth Chambers E-36L1
-		---------------------
-	- setup stativ, use our lab
-	- how-to connect ETHernet cable? it will have to go outside of fridge??
-	- how-to control temperature and humidity? (see picture from thomas dox)
-- research WS (see hardware_notes.ods for details like specs. CPU, RAM, SSDs, prices)
-- cam aufhaengung
-	research stativ/tripod: manfrotto arm + clamp + bodenplatte for cams
-	other stuff to fix cameras - stange
-- sensors for temp+humidity (HOBO)
-- backup data from towers
-- setup tower (displays,cards,cables)
--------------------------------
-- bal: func: list_suffices
-- bal: function to replace all names to snake_case (upper to lower, space/dash to underscore)
-- opd: works with "name containing spaces.pdf" -- use array for files instead of string concatenation in o_helper()
-- bug: changed IFS in o_helper broke nav function
-- 
GitLab