Просмотр исходного кода

Nightly

- implementation mirroring
- index.hthml
jomjol 5 лет назад
Родитель
Сommit
9fea3b4b3a

+ 10 - 3
README.md

@@ -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`)
 

+ 28 - 9
code/lib/jomjol_flowcontroll/ClassFlowAlignment.cpp

@@ -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,26 +87,38 @@ 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;
-            }
+            return false;
         }
         rt->Rotate(this->initalrotate);
         rt->SaveToFile(output);

+ 1 - 0
code/lib/jomjol_flowcontroll/ClassFlowAlignment.h

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

+ 15 - 1
code/lib/jomjol_flowcontroll/ClassFlowPostProcessing.cpp

@@ -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)

+ 26 - 0
code/lib/jomjol_image_proc/CFindTemplate.cpp

@@ -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];

+ 1 - 0
code/lib/jomjol_image_proc/CFindTemplate.h

@@ -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();
 };
 
 

+ 1 - 1
code/src/server_tflite.cpp

@@ -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);
     

BIN
firmware/firmware.bin


BIN
firmware/html.zip


+ 34 - 5
sd-card/html/edit_reference.html

@@ -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();
-            context.translate(imageObj.width/2,imageObj.height/2);
-            context.rotate(degrees*Math.PI/180);
-            context.drawImage(imageObj,-imageObj.width/2,-imageObj.height/2);
+            
+            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();

+ 69 - 8
sd-card/html/readconfig.js

@@ -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;
@@ -131,7 +137,7 @@ function SaveROIToConfig(_ROIInfo, _typeROI, _basepath){
           config_split.push(zw);
           for (var j = config_split.length-2; j > _pos + 1; --j){
                config_split[j] = config_split[j-1];
-           }
+          }
      }
 
      for (i = targetROI.length-1; i > _ROIInfo.length-1; --i){
@@ -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);
 }
 

+ 1 - 1
sd-card/html/wasserzaehler_roi.html

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