- implementation mirroring
- index.hthml
This commit is contained in:
jomjol
2020-09-12 09:21:13 +02:00
parent 3712c0ea7e
commit 9fea3b4b3a
12 changed files with 186 additions and 28 deletions

View File

@@ -29,17 +29,24 @@ A 3d-printable housing can be found here: https://www.thingiverse.com/thing:4571
##### Rolling - (2020-09-11)
##### Rolling - (2020-09-12)
* Option for mirroring input image
* Update index.html
2020-09-11
* Improved handling of PreValue
* Improved error handling for automated processflow (reduce spontaneous reboot - see Issues)
* Improved error handling for automated process flow (reduce spontaneous reboot - see Issues)
* Support of spaces in WLan SSID or password
2020-09-10
* Optimization of "DELETE ALL" - Autoreload of directory after delete, protection of wlan.ini
* Internal Optimization (removal of unnessary error messages, restructure CTfLiteClass)
* Internal Optimization (removal of unnecessary error messages, restructure CTfLiteClass)
* additional parameter in `wasserzahler.html?noerror=true` to suppress an potential error message in case of consitency check (is equal to `ErrorMessage` = False in `config.ini`)

View File

@@ -8,6 +8,7 @@ ClassFlowAlignment::ClassFlowAlignment()
anz_ref = 0;
suchex = 40;
suchey = 40;
initialmirror = false;
namerawimage = "/sdcard/img_tmp/raw.jpg";
ListFlowControll = NULL;
}
@@ -18,6 +19,7 @@ ClassFlowAlignment::ClassFlowAlignment(std::vector<ClassFlow*>* lfc)
anz_ref = 0;
suchex = 40;
suchey = 40;
initialmirror = false;
namerawimage = "/sdcard/img_tmp/raw.jpg";
ListFlowControll = lfc;
}
@@ -38,7 +40,12 @@ bool ClassFlowAlignment::ReadParameter(FILE* pfile, string& aktparamgraph)
while (this->getNextLine(pfile, &aktparamgraph) && !this->isNewParagraph(aktparamgraph))
{
zerlegt = this->ZerlegeZeile(aktparamgraph);
if ((zerlegt[0] == "InitalRotate") && (zerlegt.size() > 1))
if ((zerlegt[0] == "InitialMirror") && (zerlegt.size() > 1))
{
if (toUpper(zerlegt[1]) == "TRUE")
initialmirror = true;
}
if (((zerlegt[0] == "InitalRotate") || (zerlegt[0] == "InitialRotate")) && (zerlegt.size() > 1))
{
this->initalrotate = std::stod(zerlegt[1]);
}
@@ -80,27 +87,39 @@ bool ClassFlowAlignment::doFlow(string time)
string output3 = "/sdcard/img_tmp/rot_roi.jpg";
string output2 = "/sdcard/img_tmp/alg.jpg";
string output4 = "/sdcard/img_tmp/alg_roi.jpg";
string output1 = "/sdcard/img_tmp/mirror.jpg";
input = FormatFileName(input);
output = FormatFileName(output);
output2 = FormatFileName(output2);
if (initialmirror){
CRotate *rt;
rt = new CRotate(input);
if (!rt->ImageOkay()){
LogFile.WriteToFile("ClassFlowAlignment::doFlow CRotate Inital Mirror raw.jpg not okay!");
delete rt;
return false;
}
printf("do mirror\n");
rt->Mirror();
rt->SaveToFile(output1);
input = output1;
delete rt;
}
if (initalrotate != 0)
{
CRotate *rt;
CRotate *rt = NULL;
printf("Load rotationfile: %s\n", input.c_str());
rt = new CRotate(input);
if (!rt->ImageOkay()){
LogFile.WriteToFile("ClassFlowAlignment::doFlow CRotate raw.jpg not okay!");
delete rt;
LogFile.WriteToFile("ClassFlowAlignment::doFlow 1x reload.");
rt = new CRotate(input);
if (!rt->ImageOkay()){
LogFile.WriteToFile("ClassFlowAlignment::doFlow Reload auch nicht erfolgreich!");
delete rt;
return false;
}
}
rt->Rotate(this->initalrotate);
rt->SaveToFile(output);
delete rt;

View File

@@ -12,6 +12,7 @@ class ClassFlowAlignment :
{
protected:
float initalrotate;
bool initialmirror;
string reffilename[2];
int ref_x[2], ref_y[2];
int anz_ref;

View File

@@ -12,7 +12,21 @@
string ClassFlowPostProcessing::GetPreValue()
{
return to_string(PreValue);
std::string result;
result = to_string(PreValue);
for (int i = 0; i < ListFlowControll->size(); ++i)
{
if (((*ListFlowControll)[i])->name().compare("ClassFlowAnalog") == 0)
{
int AnzahlNachkomma = ((ClassFlowAnalog*)(*ListFlowControll)[i])->AnzahlROIs();
std::stringstream stream;
stream << std::fixed << std::setprecision(AnzahlNachkomma) << PreValue;
result = stream.str();
}
}
return result;
}
bool ClassFlowPostProcessing::LoadPreValue(void)

View File

@@ -44,6 +44,32 @@ void CResizeImage::Resize(int _new_dx, int _new_dy)
stbi_image_free(odata);
}
void CRotate::Mirror(){
int memsize = this->width * this->height * this->channels;
uint8_t* odata = (unsigned char*)GET_MEMORY(memsize);
int x_source, y_source;
stbi_uc* p_target;
stbi_uc* p_source;
for (int x = 0; x < this->width; ++x)
for (int y = 0; y < this->height; ++y)
{
p_target = odata + (this->channels * (y * this->width + x));
x_source = this->width - x;
y_source = y;
p_source = this->rgb_image + (this->channels * (y_source * this->width + x_source));
for (int channels = 0; channels < this->channels; ++channels)
p_target[channels] = p_source[channels];
}
// memcpy(this->rgb_image, odata, memsize);
this->memCopy(odata, this->rgb_image, memsize);
stbi_image_free(odata);
}
void CRotate::Rotate(float _angle, int _centerx, int _centery)
{
float m[2][3];

View File

@@ -70,6 +70,7 @@ class CRotate: public CImageBasis
void Rotate(float _angle);
void Rotate(float _angle, int _centerx, int _centery);
void Translate(int _dx, int _dy);
void Mirror();
};

View File

@@ -397,7 +397,7 @@ esp_err_t handler_prevalue(httpd_req_t *req)
}
if (strlen(_size) == 0)
zw = "Actual PreValue: " + tfliteflow.GetPrevalue();
zw = tfliteflow.GetPrevalue();
else
zw = "SetPrevalue to " + tfliteflow.UpdatePrevalue(_size);

Binary file not shown.

Binary file not shown.

View File

@@ -26,6 +26,17 @@
<input type="submit" id="take" onclick="doTake()" value="Make new raw image (raw.jpg)">
</td>
</tr>
<tr>
<td>
<label for="mirror">Mirror image</label>
</td>
<td>
<input type="checkbox" id="mirror" name="mirror" value="1" onchange="drawRotated()">
</td>
</tr>
<tr>
<td>
Pre-rotate Angle
@@ -85,10 +96,13 @@
url = basepath + "/fileserver/img_tmp/raw.jpg" + "?session=" + Math.floor((Math.random() * 1000000) + 1);
document.getElementById("finerotate").value = 0;
document.getElementById("prerotateangle").value = getPreRotate();
document.getElementById("mirror").checked = getMirror();
document.getElementById("finerotate").disabled = false;
document.getElementById("prerotateangle").disabled = false;
document.getElementById("updatereferenceimage").disabled = false;
document.getElementById("take").disabled = false;
document.getElementById("mirror").disabled = false;
// document.getElementById("ButtonRotate").disabled = false;
isActReference = false;
loadCanvas(url);
@@ -103,7 +117,8 @@
document.getElementById("prerotateangle").disabled = true;
document.getElementById("updatereferenceimage").disabled = true;
document.getElementById("take").disabled = true;
// document.getElementById("ButtonRotate").disabled = true;
document.getElementById("mirror").disabled = true;
isActReference = true;
loadCanvas(url);
ParseConfig();
@@ -122,7 +137,8 @@
function SaveReference(){
if (confirm("Are you sure you want to update the reference image?")) {
setPreRotate(document.getElementById("prerotateangle").value);
UpdateConfigFile(basepath);
setMirror(document.getElementById("mirror").checked);
UpdateConfigFileReferenceChange(basepath);
var canvas = document.getElementById("canvas");
drawRotated(false);
SaveCanvasToImage(canvas, "/config/reference.jpg", true, basepath);
@@ -162,12 +178,15 @@
canvas.addEventListener('mousemove', mouseMove, false);
basepath = getbasepath();
loadConfig(basepath);
ParseConfig();
showReference();
}
function drawRotated(_grid = true){
finerot= parseFloat(document.getElementById("finerotate").value);
prerot = parseFloat(document.getElementById("prerotateangle").value);
mirror = document.getElementById("mirror").checked;
if (finerot == 1) {
prerot+=1
finerot = 0
@@ -185,9 +204,19 @@
context.clearRect(0,0,imageObj.width,imageObj.height);
context.save();
if (mirror) {
context.scale(-1, 1);
context.translate(-imageObj.width/2,imageObj.height/2);
context.rotate(-degrees*Math.PI/180);
context.drawImage(imageObj, imageObj.width/2,-imageObj.height/2, -imageObj.width, imageObj.height);
}
else {
context.translate(imageObj.width/2,imageObj.height/2);
context.rotate(degrees*Math.PI/180);
context.drawImage(imageObj,-imageObj.width/2,-imageObj.height/2);
}
context.restore();
if (_grid == true && !isActReference){
drawGrid();

View File

@@ -38,7 +38,13 @@ function ParseConfigAlignment(_aktline){
while ((akt_ref < 2) && (_aktline < config_split.length) && (config_split[_aktline][0] != "[")) {
var linesplit = ZerlegeZeile(config_split[_aktline]);
if ((linesplit[0] == "InitalRotate") && (linesplit.length > 1))
if ((linesplit[0].toUpperCase() == "INITIALMIRROR") && (linesplit.length > 1))
{
initalrotate["mirror"] = linesplit[1].toUpperCase().localeCompare("TRUE") == 0;
initalrotate["pos_config_mirror"] = _aktline;
}
if (((linesplit[0].toUpperCase() == "INITALROTATE") || (linesplit[0].toUpperCase() == "INITIALROTATE")) && (linesplit.length > 1))
{
initalrotate["angle"] = parseInt(linesplit[1]);
initalrotate["pos_config"] = _aktline;
@@ -159,16 +165,16 @@ function ParseConfig() {
var aktline = 0;
while (aktline < config_split.length){
if (config_split[aktline].trim() == "[Alignment]") {
if (config_split[aktline].trim().toUpperCase() == "[ALIGNMENT]") {
aktline = ParseConfigAlignment(aktline);
continue;
}
if (config_split[aktline].trim() == "[Digits]") {
if (config_split[aktline].trim().toUpperCase() == "[DIGITS]") {
aktline = ParseConfigDigit(aktline);
continue;
}
if (config_split[aktline].trim() == "[Analog]") {
if (config_split[aktline].trim().toUpperCase() == "[ANALOG]") {
aktline = ParseConfigAnalog(aktline);
continue;
}
@@ -185,6 +191,17 @@ function setPreRotate(_prerotate){
initalrotate["angle"] = _prerotate;
}
function getMirror(){
if (initalrotate.hasOwnProperty("mirror")) {
return initalrotate["mirror"];
}
return false;
}
function setMirror(_mirror){
initalrotate["mirror"] = _mirror;
}
function SaveCanvasToImage(_canvas, _filename, _delete = true, _basepath = ""){
var JPEG_QUALITY=0.8;
var dataUrl = _canvas.toDataURL('image/jpeg', JPEG_QUALITY);
@@ -198,7 +215,11 @@ function SaveCanvasToImage(_canvas, _filename, _delete = true, _basepath = ""){
}
function SaveConfigToServer(_basepath){
FileDeleteOnServer("/config/config.ini", _basepath);
// leere Zeilen am Ende löschen
var zw = config_split.length - 1;
while (config_split[zw] == "") {
config_split.pop();
}
var config_gesamt = "";
for (var i = 0; i < config_split.length; ++i)
@@ -206,20 +227,60 @@ function SaveConfigToServer(_basepath){
config_gesamt = config_gesamt + config_split[i] + "\n";
}
FileDeleteOnServer("/config/config.ini", _basepath);
FileSendContent(config_gesamt, "/config/config.ini", _basepath);
}
function UpdateConfigFile(_basepath){
function UpdateConfigFileReferenceChange(_basepath){
for (var _index = 0; _index < ref.length; ++_index){
var zeile = ref[_index]["name"] + " " + ref[_index]["x"] + ", " + ref[_index]["y"];
var _pos = ref[_index]["pos_ref"];
config_split[_pos] = zeile;
}
zeile = "InitalRotate=" + initalrotate["angle"];
zeile = "InitialRotate = " + initalrotate["angle"];
var _pos = initalrotate["pos_config"];
config_split[_pos] = zeile;
var mirror = false;
if (initalrotate.hasOwnProperty("mirror")) {
mirror = initalrotate["mirror"];
}
var mirror_pos = -1;
if (initalrotate.hasOwnProperty("pos_config_mirror")) {
mirror_pos = initalrotate["pos_config_mirror"];
}
if (mirror_pos > -1) {
if (mirror) {
config_split[mirror_pos] = "InitialMirror = True";
}
else {
config_split[mirror_pos] = "InitialMirror = False";
}
}
else {
if (mirror) { // neue Zeile muss an der richtigen Stelle eingefügt werden - hier direct nach [Alignment]
var aktline = 0;
while (aktline < config_split.length){
if (config_split[aktline].trim() == "[Alignment]") {
break;
}
aktline++
}
// fuege neue Zeile in config_split ein
var zw = config_split[config_split.length-1];
config_split.push(zw);
for (var j = config_split.length-2; j > aktline + 1; --j){
config_split[j] = config_split[j-1];
}
config_split[aktline + 1] = "InitialMirror = True"
}
}
SaveConfigToServer(_basepath);
}

View File

@@ -66,7 +66,7 @@ function includeHTML() {
</tr>
<tr>
<th class="th">
Current Value:
Checked Value:
</th>
</tr>
<tr>