- 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 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 * Support of spaces in WLan SSID or password
2020-09-10 2020-09-10
* Optimization of "DELETE ALL" - Autoreload of directory after delete, protection of wlan.ini * 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`) * 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; anz_ref = 0;
suchex = 40; suchex = 40;
suchey = 40; suchey = 40;
initialmirror = false;
namerawimage = "/sdcard/img_tmp/raw.jpg"; namerawimage = "/sdcard/img_tmp/raw.jpg";
ListFlowControll = NULL; ListFlowControll = NULL;
} }
@@ -18,6 +19,7 @@ ClassFlowAlignment::ClassFlowAlignment(std::vector<ClassFlow*>* lfc)
anz_ref = 0; anz_ref = 0;
suchex = 40; suchex = 40;
suchey = 40; suchey = 40;
initialmirror = false;
namerawimage = "/sdcard/img_tmp/raw.jpg"; namerawimage = "/sdcard/img_tmp/raw.jpg";
ListFlowControll = lfc; ListFlowControll = lfc;
} }
@@ -38,7 +40,12 @@ bool ClassFlowAlignment::ReadParameter(FILE* pfile, string& aktparamgraph)
while (this->getNextLine(pfile, &aktparamgraph) && !this->isNewParagraph(aktparamgraph)) while (this->getNextLine(pfile, &aktparamgraph) && !this->isNewParagraph(aktparamgraph))
{ {
zerlegt = this->ZerlegeZeile(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]); this->initalrotate = std::stod(zerlegt[1]);
} }
@@ -80,27 +87,39 @@ bool ClassFlowAlignment::doFlow(string time)
string output3 = "/sdcard/img_tmp/rot_roi.jpg"; string output3 = "/sdcard/img_tmp/rot_roi.jpg";
string output2 = "/sdcard/img_tmp/alg.jpg"; string output2 = "/sdcard/img_tmp/alg.jpg";
string output4 = "/sdcard/img_tmp/alg_roi.jpg"; string output4 = "/sdcard/img_tmp/alg_roi.jpg";
string output1 = "/sdcard/img_tmp/mirror.jpg";
input = FormatFileName(input); input = FormatFileName(input);
output = FormatFileName(output); output = FormatFileName(output);
output2 = FormatFileName(output2); 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) if (initalrotate != 0)
{ {
CRotate *rt; CRotate *rt = NULL;
printf("Load rotationfile: %s\n", input.c_str());
rt = new CRotate(input); rt = new CRotate(input);
if (!rt->ImageOkay()){ if (!rt->ImageOkay()){
LogFile.WriteToFile("ClassFlowAlignment::doFlow CRotate raw.jpg not okay!"); LogFile.WriteToFile("ClassFlowAlignment::doFlow CRotate raw.jpg not okay!");
delete rt; 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->Rotate(this->initalrotate);
rt->SaveToFile(output); rt->SaveToFile(output);
delete rt; delete rt;

View File

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

View File

@@ -12,7 +12,21 @@
string ClassFlowPostProcessing::GetPreValue() 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) bool ClassFlowPostProcessing::LoadPreValue(void)

View File

@@ -44,6 +44,32 @@ void CResizeImage::Resize(int _new_dx, int _new_dy)
stbi_image_free(odata); 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) void CRotate::Rotate(float _angle, int _centerx, int _centery)
{ {
float m[2][3]; float m[2][3];

View File

@@ -70,6 +70,7 @@ class CRotate: public CImageBasis
void Rotate(float _angle); void Rotate(float _angle);
void Rotate(float _angle, int _centerx, int _centery); void Rotate(float _angle, int _centerx, int _centery);
void Translate(int _dx, int _dy); 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) if (strlen(_size) == 0)
zw = "Actual PreValue: " + tfliteflow.GetPrevalue(); zw = tfliteflow.GetPrevalue();
else else
zw = "SetPrevalue to " + tfliteflow.UpdatePrevalue(_size); 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)"> <input type="submit" id="take" onclick="doTake()" value="Make new raw image (raw.jpg)">
</td> </td>
</tr> </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> <tr>
<td> <td>
Pre-rotate Angle Pre-rotate Angle
@@ -85,10 +96,13 @@
url = basepath + "/fileserver/img_tmp/raw.jpg" + "?session=" + Math.floor((Math.random() * 1000000) + 1); url = basepath + "/fileserver/img_tmp/raw.jpg" + "?session=" + Math.floor((Math.random() * 1000000) + 1);
document.getElementById("finerotate").value = 0; document.getElementById("finerotate").value = 0;
document.getElementById("prerotateangle").value = getPreRotate(); document.getElementById("prerotateangle").value = getPreRotate();
document.getElementById("mirror").checked = getMirror();
document.getElementById("finerotate").disabled = false; document.getElementById("finerotate").disabled = false;
document.getElementById("prerotateangle").disabled = false; document.getElementById("prerotateangle").disabled = false;
document.getElementById("updatereferenceimage").disabled = false; document.getElementById("updatereferenceimage").disabled = false;
document.getElementById("take").disabled = false; document.getElementById("take").disabled = false;
document.getElementById("mirror").disabled = false;
// document.getElementById("ButtonRotate").disabled = false; // document.getElementById("ButtonRotate").disabled = false;
isActReference = false; isActReference = false;
loadCanvas(url); loadCanvas(url);
@@ -103,7 +117,8 @@
document.getElementById("prerotateangle").disabled = true; document.getElementById("prerotateangle").disabled = true;
document.getElementById("updatereferenceimage").disabled = true; document.getElementById("updatereferenceimage").disabled = true;
document.getElementById("take").disabled = true; document.getElementById("take").disabled = true;
// document.getElementById("ButtonRotate").disabled = true; document.getElementById("mirror").disabled = true;
isActReference = true; isActReference = true;
loadCanvas(url); loadCanvas(url);
ParseConfig(); ParseConfig();
@@ -122,7 +137,8 @@
function SaveReference(){ function SaveReference(){
if (confirm("Are you sure you want to update the reference image?")) { if (confirm("Are you sure you want to update the reference image?")) {
setPreRotate(document.getElementById("prerotateangle").value); setPreRotate(document.getElementById("prerotateangle").value);
UpdateConfigFile(basepath); setMirror(document.getElementById("mirror").checked);
UpdateConfigFileReferenceChange(basepath);
var canvas = document.getElementById("canvas"); var canvas = document.getElementById("canvas");
drawRotated(false); drawRotated(false);
SaveCanvasToImage(canvas, "/config/reference.jpg", true, basepath); SaveCanvasToImage(canvas, "/config/reference.jpg", true, basepath);
@@ -162,12 +178,15 @@
canvas.addEventListener('mousemove', mouseMove, false); canvas.addEventListener('mousemove', mouseMove, false);
basepath = getbasepath(); basepath = getbasepath();
loadConfig(basepath); loadConfig(basepath);
ParseConfig();
showReference(); showReference();
} }
function drawRotated(_grid = true){ function drawRotated(_grid = true){
finerot= parseFloat(document.getElementById("finerotate").value); finerot= parseFloat(document.getElementById("finerotate").value);
prerot = parseFloat(document.getElementById("prerotateangle").value); prerot = parseFloat(document.getElementById("prerotateangle").value);
mirror = document.getElementById("mirror").checked;
if (finerot == 1) { if (finerot == 1) {
prerot+=1 prerot+=1
finerot = 0 finerot = 0
@@ -185,9 +204,19 @@
context.clearRect(0,0,imageObj.width,imageObj.height); context.clearRect(0,0,imageObj.width,imageObj.height);
context.save(); 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.translate(imageObj.width/2,imageObj.height/2);
context.rotate(degrees*Math.PI/180); context.rotate(degrees*Math.PI/180);
context.drawImage(imageObj,-imageObj.width/2,-imageObj.height/2); context.drawImage(imageObj,-imageObj.width/2,-imageObj.height/2);
}
context.restore(); context.restore();
if (_grid == true && !isActReference){ if (_grid == true && !isActReference){
drawGrid(); drawGrid();

View File

@@ -38,7 +38,13 @@ function ParseConfigAlignment(_aktline){
while ((akt_ref < 2) && (_aktline < config_split.length) && (config_split[_aktline][0] != "[")) { while ((akt_ref < 2) && (_aktline < config_split.length) && (config_split[_aktline][0] != "[")) {
var linesplit = ZerlegeZeile(config_split[_aktline]); 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["angle"] = parseInt(linesplit[1]);
initalrotate["pos_config"] = _aktline; initalrotate["pos_config"] = _aktline;
@@ -159,16 +165,16 @@ function ParseConfig() {
var aktline = 0; var aktline = 0;
while (aktline < config_split.length){ while (aktline < config_split.length){
if (config_split[aktline].trim() == "[Alignment]") { if (config_split[aktline].trim().toUpperCase() == "[ALIGNMENT]") {
aktline = ParseConfigAlignment(aktline); aktline = ParseConfigAlignment(aktline);
continue; continue;
} }
if (config_split[aktline].trim() == "[Digits]") { if (config_split[aktline].trim().toUpperCase() == "[DIGITS]") {
aktline = ParseConfigDigit(aktline); aktline = ParseConfigDigit(aktline);
continue; continue;
} }
if (config_split[aktline].trim() == "[Analog]") { if (config_split[aktline].trim().toUpperCase() == "[ANALOG]") {
aktline = ParseConfigAnalog(aktline); aktline = ParseConfigAnalog(aktline);
continue; continue;
} }
@@ -185,6 +191,17 @@ function setPreRotate(_prerotate){
initalrotate["angle"] = _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 = ""){ function SaveCanvasToImage(_canvas, _filename, _delete = true, _basepath = ""){
var JPEG_QUALITY=0.8; var JPEG_QUALITY=0.8;
var dataUrl = _canvas.toDataURL('image/jpeg', JPEG_QUALITY); var dataUrl = _canvas.toDataURL('image/jpeg', JPEG_QUALITY);
@@ -198,7 +215,11 @@ function SaveCanvasToImage(_canvas, _filename, _delete = true, _basepath = ""){
} }
function SaveConfigToServer(_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 = ""; var config_gesamt = "";
for (var i = 0; i < config_split.length; ++i) for (var i = 0; i < config_split.length; ++i)
@@ -206,20 +227,60 @@ function SaveConfigToServer(_basepath){
config_gesamt = config_gesamt + config_split[i] + "\n"; config_gesamt = config_gesamt + config_split[i] + "\n";
} }
FileDeleteOnServer("/config/config.ini", _basepath);
FileSendContent(config_gesamt, "/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){ for (var _index = 0; _index < ref.length; ++_index){
var zeile = ref[_index]["name"] + " " + ref[_index]["x"] + ", " + ref[_index]["y"]; var zeile = ref[_index]["name"] + " " + ref[_index]["x"] + ", " + ref[_index]["y"];
var _pos = ref[_index]["pos_ref"]; var _pos = ref[_index]["pos_ref"];
config_split[_pos] = zeile; config_split[_pos] = zeile;
} }
zeile = "InitalRotate=" + initalrotate["angle"]; zeile = "InitialRotate = " + initalrotate["angle"];
var _pos = initalrotate["pos_config"]; var _pos = initalrotate["pos_config"];
config_split[_pos] = zeile; 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); SaveConfigToServer(_basepath);
} }

View File

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