Latest commit

History

38 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

BUILDING
You'll need to have a C++ compiler, make, gtkmm and gstreamermm (along with the
"base" and "good" gstreamer plugins) to be able to run this program.
On Ubuntu (verified on Ubuntu 20.04) this means installing the following
packages:
build-essential libgtkmm-3.0-dev libgstreamermm-1.0-dev
libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev
On ArchLinux this means installing the following packages:
base-devel gtkmm gstreamermm gst-plugins-base gst-plugins-good
To compile just download this repository and run `make` inside this directory.
This should build the program and produce an executable called `watermeter`
USAGE
First position your camera. Try to position it so that the image is square and
try to avoid any bright reflections around the needle.
Then start the program:
./watermeter
Pressing the enter key will refresh the image you see. Press enter at least once
to give yourself an accurate image of what the webcam is seeing.
Pressing r will bring up a dialog to enter the current reading of the dial.
Enter the current whole number reading of the dial up to any precision that you
want. This value will be updated as the needle moves around the dial.
Click and drag with the left mouse button to draw a circle. This circle
represents where the program will search for the needle. Draw a circle around
the dial, starting from the center, stopping where the needle ends. This should
also place a green indicator line showing you where the program thinks the
needle currently is.
When satisfied with the programs detection of the needles location press the
spacebar to start collecting data. The program will begin writing the estimated
reading of the dial to DATA_FILE every OUTPUT_RATE
milliseconds (see CONFIGURATION).
CONTROLS
There is a limited set of controls when using the program:
Click + Drag (on webcam image): Draw the circle to search for the needle.
r: Set the current reading of the dial (See GUIDE).
j: Increase the outer radius of the needle detection zone.
CTRL-j: Increase the inner radius of the needle detection zone.
k: Decrease the outer radius of the needle detection zone.
CTRL-k: Decrease the inner radius of the needle detection zone.
Space: Begin data collection.
COMMAND LINE OPTIONS
When running the program you can optionally specify these options:
-s Save the current frame every full rotation of the dial.
-a Save every frame.
-t Run the TED data collection program every hour. (Make sure to set the
TED_PATH configuration option below)
-d Save debug images every frame.
-h Save a histogram of needle detection data every frame.
CONFIGURATION
There are some options you can configure within `config.h`:
TED_PATH - The path to the TED data collection script. (Default:
"~/ted/hourly/datacollection.py")
NUM_ANGLES - An integer specifying the number of angles to check around the
circle you draw. (Default: 512)
OUTPUT_RATE - The number of milliseconds between data points. (Default: 5000)
DATA_FILE - The file to write the estimated readings to. (Default:
"meter.csv")
HIST_FILE - The file to write the histogram data to. (Default: "hist.csv")
IMAGES_FOLDER - the folder in which to save all images
DEBUG_FOLDER - The folder in which to save all debug images

About

A simple linux app to track water usage via a webcam pointed at a water meter

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

38 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

BUILDING
You'll need to have a C++ compiler, make, gtkmm and gstreamermm (along with the
"base" and "good" gstreamer plugins) to be able to run this program.
On Ubuntu (verified on Ubuntu 20.04) this means installing the following
packages:
build-essential libgtkmm-3.0-dev libgstreamermm-1.0-dev
libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev
On ArchLinux this means installing the following packages:
base-devel gtkmm gstreamermm gst-plugins-base gst-plugins-good
To compile just download this repository and run `make` inside this directory.
This should build the program and produce an executable called `watermeter`
USAGE
First position your camera. Try to position it so that the image is square and
try to avoid any bright reflections around the needle.
Then start the program:
./watermeter
Pressing the enter key will refresh the image you see. Press enter at least once
to give yourself an accurate image of what the webcam is seeing.
Pressing r will bring up a dialog to enter the current reading of the dial.
Enter the current whole number reading of the dial up to any precision that you
want. This value will be updated as the needle moves around the dial.
Click and drag with the left mouse button to draw a circle. This circle
represents where the program will search for the needle. Draw a circle around
the dial, starting from the center, stopping where the needle ends. This should
also place a green indicator line showing you where the program thinks the
needle currently is.
When satisfied with the programs detection of the needles location press the
spacebar to start collecting data. The program will begin writing the estimated
reading of the dial to DATA_FILE every OUTPUT_RATE
milliseconds (see CONFIGURATION).
CONTROLS
There is a limited set of controls when using the program:
Click + Drag (on webcam image): Draw the circle to search for the needle.
r: Set the current reading of the dial (See GUIDE).
j: Increase the outer radius of the needle detection zone.
CTRL-j: Increase the inner radius of the needle detection zone.
k: Decrease the outer radius of the needle detection zone.
CTRL-k: Decrease the inner radius of the needle detection zone.
Space: Begin data collection.
COMMAND LINE OPTIONS
When running the program you can optionally specify these options:
-s Save the current frame every full rotation of the dial.
-a Save every frame.
-t Run the TED data collection program every hour. (Make sure to set the
TED_PATH configuration option below)
-d Save debug images every frame.
-h Save a histogram of needle detection data every frame.
CONFIGURATION
There are some options you can configure within `config.h`:
TED_PATH - The path to the TED data collection script. (Default:
"~/ted/hourly/datacollection.py")
NUM_ANGLES - An integer specifying the number of angles to check around the
circle you draw. (Default: 512)
OUTPUT_RATE - The number of milliseconds between data points. (Default: 5000)
DATA_FILE - The file to write the estimated readings to. (Default:
"meter.csv")
HIST_FILE - The file to write the histogram data to. (Default: "hist.csv")
IMAGES_FOLDER - the folder in which to save all images
DEBUG_FOLDER - The folder in which to save all debug images

About

A simple linux app to track water usage via a webcam pointed at a water meter

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

38 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

BUILDING
You'll need to have a C++ compiler, make, gtkmm and gstreamermm (along with the
"base" and "good" gstreamer plugins) to be able to run this program.
On Ubuntu (verified on Ubuntu 20.04) this means installing the following
packages:
build-essential libgtkmm-3.0-dev libgstreamermm-1.0-dev
libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev
On ArchLinux this means installing the following packages:
base-devel gtkmm gstreamermm gst-plugins-base gst-plugins-good
To compile just download this repository and run `make` inside this directory.
This should build the program and produce an executable called `watermeter`
USAGE
First position your camera. Try to position it so that the image is square and
try to avoid any bright reflections around the needle.
Then start the program:
./watermeter
Pressing the enter key will refresh the image you see. Press enter at least once
to give yourself an accurate image of what the webcam is seeing.
Pressing r will bring up a dialog to enter the current reading of the dial.
Enter the current whole number reading of the dial up to any precision that you
want. This value will be updated as the needle moves around the dial.
Click and drag with the left mouse button to draw a circle. This circle
represents where the program will search for the needle. Draw a circle around
the dial, starting from the center, stopping where the needle ends. This should
also place a green indicator line showing you where the program thinks the
needle currently is.
When satisfied with the programs detection of the needles location press the
spacebar to start collecting data. The program will begin writing the estimated
reading of the dial to DATA_FILE every OUTPUT_RATE
milliseconds (see CONFIGURATION).
CONTROLS
There is a limited set of controls when using the program:
Click + Drag (on webcam image): Draw the circle to search for the needle.
r: Set the current reading of the dial (See GUIDE).
j: Increase the outer radius of the needle detection zone.
CTRL-j: Increase the inner radius of the needle detection zone.
k: Decrease the outer radius of the needle detection zone.
CTRL-k: Decrease the inner radius of the needle detection zone.
Space: Begin data collection.
COMMAND LINE OPTIONS
When running the program you can optionally specify these options:
-s Save the current frame every full rotation of the dial.
-a Save every frame.
-t Run the TED data collection program every hour. (Make sure to set the
TED_PATH configuration option below)
-d Save debug images every frame.
-h Save a histogram of needle detection data every frame.
CONFIGURATION
There are some options you can configure within `config.h`:
TED_PATH - The path to the TED data collection script. (Default:
"~/ted/hourly/datacollection.py")
NUM_ANGLES - An integer specifying the number of angles to check around the
circle you draw. (Default: 512)
OUTPUT_RATE - The number of milliseconds between data points. (Default: 5000)
DATA_FILE - The file to write the estimated readings to. (Default:
"meter.csv")
HIST_FILE - The file to write the histogram data to. (Default: "hist.csv")
IMAGES_FOLDER - the folder in which to save all images
DEBUG_FOLDER - The folder in which to save all debug images

About

A simple linux app to track water usage via a webcam pointed at a water meter

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

38 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

BUILDING
You'll need to have a C++ compiler, make, gtkmm and gstreamermm (along with the
"base" and "good" gstreamer plugins) to be able to run this program.
On Ubuntu (verified on Ubuntu 20.04) this means installing the following
packages:
build-essential libgtkmm-3.0-dev libgstreamermm-1.0-dev
libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev
On ArchLinux this means installing the following packages:
base-devel gtkmm gstreamermm gst-plugins-base gst-plugins-good
To compile just download this repository and run `make` inside this directory.
This should build the program and produce an executable called `watermeter`
USAGE
First position your camera. Try to position it so that the image is square and
try to avoid any bright reflections around the needle.
Then start the program:
./watermeter
Pressing the enter key will refresh the image you see. Press enter at least once
to give yourself an accurate image of what the webcam is seeing.
Pressing r will bring up a dialog to enter the current reading of the dial.
Enter the current whole number reading of the dial up to any precision that you
want. This value will be updated as the needle moves around the dial.
Click and drag with the left mouse button to draw a circle. This circle
represents where the program will search for the needle. Draw a circle around
the dial, starting from the center, stopping where the needle ends. This should
also place a green indicator line showing you where the program thinks the
needle currently is.
When satisfied with the programs detection of the needles location press the
spacebar to start collecting data. The program will begin writing the estimated
reading of the dial to DATA_FILE every OUTPUT_RATE
milliseconds (see CONFIGURATION).
CONTROLS
There is a limited set of controls when using the program:
Click + Drag (on webcam image): Draw the circle to search for the needle.
r: Set the current reading of the dial (See GUIDE).
j: Increase the outer radius of the needle detection zone.
CTRL-j: Increase the inner radius of the needle detection zone.
k: Decrease the outer radius of the needle detection zone.
CTRL-k: Decrease the inner radius of the needle detection zone.
Space: Begin data collection.
COMMAND LINE OPTIONS
When running the program you can optionally specify these options:
-s Save the current frame every full rotation of the dial.
-a Save every frame.
-t Run the TED data collection program every hour. (Make sure to set the
TED_PATH configuration option below)
-d Save debug images every frame.
-h Save a histogram of needle detection data every frame.
CONFIGURATION
There are some options you can configure within `config.h`:
TED_PATH - The path to the TED data collection script. (Default:
"~/ted/hourly/datacollection.py")
NUM_ANGLES - An integer specifying the number of angles to check around the
circle you draw. (Default: 512)
OUTPUT_RATE - The number of milliseconds between data points. (Default: 5000)
DATA_FILE - The file to write the estimated readings to. (Default:
"meter.csv")
HIST_FILE - The file to write the histogram data to. (Default: "hist.csv")
IMAGES_FOLDER - the folder in which to save all images
DEBUG_FOLDER - The folder in which to save all debug images

About

A simple linux app to track water usage via a webcam pointed at a water meter

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

38 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

BUILDING
You'll need to have a C++ compiler, make, gtkmm and gstreamermm (along with the
"base" and "good" gstreamer plugins) to be able to run this program.
On Ubuntu (verified on Ubuntu 20.04) this means installing the following
packages:
build-essential libgtkmm-3.0-dev libgstreamermm-1.0-dev
libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev
On ArchLinux this means installing the following packages:
base-devel gtkmm gstreamermm gst-plugins-base gst-plugins-good
To compile just download this repository and run `make` inside this directory.
This should build the program and produce an executable called `watermeter`
USAGE
First position your camera. Try to position it so that the image is square and
try to avoid any bright reflections around the needle.
Then start the program:
./watermeter
Pressing the enter key will refresh the image you see. Press enter at least once
to give yourself an accurate image of what the webcam is seeing.
Pressing r will bring up a dialog to enter the current reading of the dial.
Enter the current whole number reading of the dial up to any precision that you
want. This value will be updated as the needle moves around the dial.
Click and drag with the left mouse button to draw a circle. This circle
represents where the program will search for the needle. Draw a circle around
the dial, starting from the center, stopping where the needle ends. This should
also place a green indicator line showing you where the program thinks the
needle currently is.
When satisfied with the programs detection of the needles location press the
spacebar to start collecting data. The program will begin writing the estimated
reading of the dial to DATA_FILE every OUTPUT_RATE
milliseconds (see CONFIGURATION).
CONTROLS
There is a limited set of controls when using the program:
Click + Drag (on webcam image): Draw the circle to search for the needle.
r: Set the current reading of the dial (See GUIDE).
j: Increase the outer radius of the needle detection zone.
CTRL-j: Increase the inner radius of the needle detection zone.
k: Decrease the outer radius of the needle detection zone.
CTRL-k: Decrease the inner radius of the needle detection zone.
Space: Begin data collection.
COMMAND LINE OPTIONS
When running the program you can optionally specify these options:
-s Save the current frame every full rotation of the dial.
-a Save every frame.
-t Run the TED data collection program every hour. (Make sure to set the
TED_PATH configuration option below)
-d Save debug images every frame.
-h Save a histogram of needle detection data every frame.
CONFIGURATION
There are some options you can configure within `config.h`:
TED_PATH - The path to the TED data collection script. (Default:
"~/ted/hourly/datacollection.py")
NUM_ANGLES - An integer specifying the number of angles to check around the
circle you draw. (Default: 512)
OUTPUT_RATE - The number of milliseconds between data points. (Default: 5000)
DATA_FILE - The file to write the estimated readings to. (Default:
"meter.csv")
HIST_FILE - The file to write the histogram data to. (Default: "hist.csv")
IMAGES_FOLDER - the folder in which to save all images
DEBUG_FOLDER - The folder in which to save all debug images

About

A simple linux app to track water usage via a webcam pointed at a water meter

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

38 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

BUILDING
You'll need to have a C++ compiler, make, gtkmm and gstreamermm (along with the
"base" and "good" gstreamer plugins) to be able to run this program.
On Ubuntu (verified on Ubuntu 20.04) this means installing the following
packages:
build-essential libgtkmm-3.0-dev libgstreamermm-1.0-dev
libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev
On ArchLinux this means installing the following packages:
base-devel gtkmm gstreamermm gst-plugins-base gst-plugins-good
To compile just download this repository and run `make` inside this directory.
This should build the program and produce an executable called `watermeter`
USAGE
First position your camera. Try to position it so that the image is square and
try to avoid any bright reflections around the needle.
Then start the program:
./watermeter
Pressing the enter key will refresh the image you see. Press enter at least once
to give yourself an accurate image of what the webcam is seeing.
Pressing r will bring up a dialog to enter the current reading of the dial.
Enter the current whole number reading of the dial up to any precision that you
want. This value will be updated as the needle moves around the dial.
Click and drag with the left mouse button to draw a circle. This circle
represents where the program will search for the needle. Draw a circle around
the dial, starting from the center, stopping where the needle ends. This should
also place a green indicator line showing you where the program thinks the
needle currently is.
When satisfied with the programs detection of the needles location press the
spacebar to start collecting data. The program will begin writing the estimated
reading of the dial to DATA_FILE every OUTPUT_RATE
milliseconds (see CONFIGURATION).
CONTROLS
There is a limited set of controls when using the program:
Click + Drag (on webcam image): Draw the circle to search for the needle.
r: Set the current reading of the dial (See GUIDE).
j: Increase the outer radius of the needle detection zone.
CTRL-j: Increase the inner radius of the needle detection zone.
k: Decrease the outer radius of the needle detection zone.
CTRL-k: Decrease the inner radius of the needle detection zone.
Space: Begin data collection.
COMMAND LINE OPTIONS
When running the program you can optionally specify these options:
-s Save the current frame every full rotation of the dial.
-a Save every frame.
-t Run the TED data collection program every hour. (Make sure to set the
TED_PATH configuration option below)
-d Save debug images every frame.
-h Save a histogram of needle detection data every frame.
CONFIGURATION
There are some options you can configure within `config.h`:
TED_PATH - The path to the TED data collection script. (Default:
"~/ted/hourly/datacollection.py")
NUM_ANGLES - An integer specifying the number of angles to check around the
circle you draw. (Default: 512)
OUTPUT_RATE - The number of milliseconds between data points. (Default: 5000)
DATA_FILE - The file to write the estimated readings to. (Default:
"meter.csv")
HIST_FILE - The file to write the histogram data to. (Default: "hist.csv")
IMAGES_FOLDER - the folder in which to save all images
DEBUG_FOLDER - The folder in which to save all debug images

About

A simple linux app to track water usage via a webcam pointed at a water meter

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

38 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

BUILDING
You'll need to have a C++ compiler, make, gtkmm and gstreamermm (along with the
"base" and "good" gstreamer plugins) to be able to run this program.
On Ubuntu (verified on Ubuntu 20.04) this means installing the following
packages:
build-essential libgtkmm-3.0-dev libgstreamermm-1.0-dev
libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev
On ArchLinux this means installing the following packages:
base-devel gtkmm gstreamermm gst-plugins-base gst-plugins-good
To compile just download this repository and run `make` inside this directory.
This should build the program and produce an executable called `watermeter`
USAGE
First position your camera. Try to position it so that the image is square and
try to avoid any bright reflections around the needle.
Then start the program:
./watermeter
Pressing the enter key will refresh the image you see. Press enter at least once
to give yourself an accurate image of what the webcam is seeing.
Pressing r will bring up a dialog to enter the current reading of the dial.
Enter the current whole number reading of the dial up to any precision that you
want. This value will be updated as the needle moves around the dial.
Click and drag with the left mouse button to draw a circle. This circle
represents where the program will search for the needle. Draw a circle around
the dial, starting from the center, stopping where the needle ends. This should
also place a green indicator line showing you where the program thinks the
needle currently is.
When satisfied with the programs detection of the needles location press the
spacebar to start collecting data. The program will begin writing the estimated
reading of the dial to DATA_FILE every OUTPUT_RATE
milliseconds (see CONFIGURATION).
CONTROLS
There is a limited set of controls when using the program:
Click + Drag (on webcam image): Draw the circle to search for the needle.
r: Set the current reading of the dial (See GUIDE).
j: Increase the outer radius of the needle detection zone.
CTRL-j: Increase the inner radius of the needle detection zone.
k: Decrease the outer radius of the needle detection zone.
CTRL-k: Decrease the inner radius of the needle detection zone.
Space: Begin data collection.
COMMAND LINE OPTIONS
When running the program you can optionally specify these options:
-s Save the current frame every full rotation of the dial.
-a Save every frame.
-t Run the TED data collection program every hour. (Make sure to set the
TED_PATH configuration option below)
-d Save debug images every frame.
-h Save a histogram of needle detection data every frame.
CONFIGURATION
There are some options you can configure within `config.h`:
TED_PATH - The path to the TED data collection script. (Default:
"~/ted/hourly/datacollection.py")
NUM_ANGLES - An integer specifying the number of angles to check around the
circle you draw. (Default: 512)
OUTPUT_RATE - The number of milliseconds between data points. (Default: 5000)
DATA_FILE - The file to write the estimated readings to. (Default:
"meter.csv")
HIST_FILE - The file to write the histogram data to. (Default: "hist.csv")
IMAGES_FOLDER - the folder in which to save all images
DEBUG_FOLDER - The folder in which to save all debug images

About

A simple linux app to track water usage via a webcam pointed at a water meter

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

38 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

BUILDING
You'll need to have a C++ compiler, make, gtkmm and gstreamermm (along with the
"base" and "good" gstreamer plugins) to be able to run this program.
On Ubuntu (verified on Ubuntu 20.04) this means installing the following
packages:
build-essential libgtkmm-3.0-dev libgstreamermm-1.0-dev
libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev
On ArchLinux this means installing the following packages:
base-devel gtkmm gstreamermm gst-plugins-base gst-plugins-good
To compile just download this repository and run `make` inside this directory.
This should build the program and produce an executable called `watermeter`
USAGE
First position your camera. Try to position it so that the image is square and
try to avoid any bright reflections around the needle.
Then start the program:
./watermeter
Pressing the enter key will refresh the image you see. Press enter at least once
to give yourself an accurate image of what the webcam is seeing.
Pressing r will bring up a dialog to enter the current reading of the dial.
Enter the current whole number reading of the dial up to any precision that you
want. This value will be updated as the needle moves around the dial.
Click and drag with the left mouse button to draw a circle. This circle
represents where the program will search for the needle. Draw a circle around
the dial, starting from the center, stopping where the needle ends. This should
also place a green indicator line showing you where the program thinks the
needle currently is.
When satisfied with the programs detection of the needles location press the
spacebar to start collecting data. The program will begin writing the estimated
reading of the dial to DATA_FILE every OUTPUT_RATE
milliseconds (see CONFIGURATION).
CONTROLS
There is a limited set of controls when using the program:
Click + Drag (on webcam image): Draw the circle to search for the needle.
r: Set the current reading of the dial (See GUIDE).
j: Increase the outer radius of the needle detection zone.
CTRL-j: Increase the inner radius of the needle detection zone.
k: Decrease the outer radius of the needle detection zone.
CTRL-k: Decrease the inner radius of the needle detection zone.
Space: Begin data collection.
COMMAND LINE OPTIONS
When running the program you can optionally specify these options:
-s Save the current frame every full rotation of the dial.
-a Save every frame.
-t Run the TED data collection program every hour. (Make sure to set the
TED_PATH configuration option below)
-d Save debug images every frame.
-h Save a histogram of needle detection data every frame.
CONFIGURATION
There are some options you can configure within `config.h`:
TED_PATH - The path to the TED data collection script. (Default:
"~/ted/hourly/datacollection.py")
NUM_ANGLES - An integer specifying the number of angles to check around the
circle you draw. (Default: 512)
OUTPUT_RATE - The number of milliseconds between data points. (Default: 5000)
DATA_FILE - The file to write the estimated readings to. (Default:
"meter.csv")
HIST_FILE - The file to write the histogram data to. (Default: "hist.csv")
IMAGES_FOLDER - the folder in which to save all images
DEBUG_FOLDER - The folder in which to save all debug images

About

A simple linux app to track water usage via a webcam pointed at a water meter

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages