?
Ah, vielen Dank für's Antworten!
Naja, ich hab' mir die Entwicklungsumgebung gestern installiert, daher nahm ich bereits an, vieles grundlegend falsch zu machen.
Vielen Dank für den Hinweis auf Initialisierungslisten und dem Delete-Befehl!
Ist eine rekursive contain-Methode nicht genauso effizient wie eine iterative hier? schließlich wird ja in jedem Fall alles bis zum Treffer durchgegangen...
Und vielen Dank für den Hinweis auf list!
ich habe jetzt
struct coord{
int x;
int y;
int breite;
bool operator==(const coord& l) const
{
return ((l.x == this->x)&&(l.y==this->y));
}
};
list<coord> ev;
[...]
ev.clear();
coord pkt={0,0};
ev.push_front(pkt);
for(list<coord>::iterator aktev=e.begin();aktev!=e.end();aktev++){
Wobei ich die Ahnung habe, einige andere Dinge sehr unperformat gelöst zu haben. Könntest du vielleicht noch einen Blick auf den Rest des Programms werfen?
#include "testrauschen.h"
#include "ui_testrauschen.h"
#include <QGraphicsScene>
#include <QFileDialog>
#include <QImage>
#include <list>
#include <stdio.h>
using namespace std;
struct coord{
int x;
int y;
int breite;
bool operator==(const coord& l) const
{
return ((l.x == this->x)&&(l.y==this->y));
}
};
QImage img;
int auf=0;
QString fileName="";
list<coord> ev;
testrauschen::testrauschen(QWidget *parent) :
QWidget(parent),
ui(new Ui::testrauschen)
{
ui->setupUi(this);
QWidget::setWindowFlags( Qt::MSWindowsFixedSizeDialogHint | Qt::WindowMinimizeButtonHint);
}
testrauschen::~testrauschen()
{
delete ui;
}
void testrauschen::on_pushButton_clicked()
{
QGraphicsView *w = ui->graphicsView;
QGraphicsScene *scn = new QGraphicsScene(w);
if(fileName=="")return;
QPixmap pix(fileName);
img = pix.toImage();
scn->addPixmap( pix );
w->setScene( scn );
w->fitInView(scn->sceneRect(), Qt::KeepAspectRatio);
auf=0;
ev.clear();
analyse();
QImage img2=img;
ui->listWidget->clear();
list<coord>::iterator aktev = ev.begin();
for(aktev=ev.begin();aktev!=ev.end();aktev++) {
img2.setPixel(QPoint(aktev->x,aktev->y),qRgb(255,0,0));
if(aktev->x<99)img2.setPixel(QPoint(aktev->x+1,aktev->y),qRgb(255,0,0));
if(aktev->x>0)img2.setPixel(QPoint(aktev->x-1,aktev->y),qRgb(255,0,0));
if(aktev->y<99)img2.setPixel(QPoint(aktev->x,aktev->y+1),qRgb(255,0,0));
if(aktev->y>0)img2.setPixel(QPoint(aktev->x,aktev->y-1),qRgb(255,0,0));
ui->listWidget->insertItem(0,QString::number(aktev->x)+"|"+QString::number(aktev->y));
}
ui->label_3->setText(QString::number(ev.size()));
ui->label_2->setText(QString::number(auf));
QGraphicsScene *scn2 = new QGraphicsScene(ui->graphicsView_2);
scn2->addPixmap(QPixmap::fromImage(img2));
ui->graphicsView_2->setScene(scn2);
ui->graphicsView_2->fitInView(scn2->sceneRect(), Qt::KeepAspectRatio);
}
QStringList lister(list<coord> e){
QStringList ruck;
for(list<coord>::iterator aktev=e.begin();aktev!=e.end();aktev++){
ruck.append(aktev->x+"|"+aktev->y);
}
return ruck;
}
void testrauschen::analyse(){
int schwelle = ui->horizontalSlider->value();
for(int y=0;y<100;y++){
for(int x=1;x<100;x++){
auf += 1;
if(qGray(img.pixel(x - 1,y)) < qGray(img.pixel(x,y)) - schwelle)
x = zentrum(x, y);
}
}
}
int testrauschen::zentrum(int x, int y){
auf += 1;
float rx = 0;
float ry1 = 0;
float ry2 = 0;
if(x < 99)rx = qGray(img.pixel(x + 1,y)) - qGray(img.pixel(x,y));
if(y < 99)ry1 = qGray(img.pixel(x,y + 1)) - qGray(img.pixel(x,y));
if(y > 0)ry2 = qGray(img.pixel(x,y - 1)) - qGray(img.pixel(x,y));
if(x < 99 && rx >= 0 && rx >= ry1 && rx >= ry2)return zentrum(x + 1, y);
if(y < 99 && ry1 >= 0 && ry1 >= rx && ry1 >= ry2)return zentrum(x, y + 1);
if(y > 0 && ry2 > 0 && ry2 >= rx && ry2 >= ry1)return zentrum(x, y - 1);
coord pkt={x,y,0};
if(std::find(ev.begin(),ev.end(),pkt)==ev.end())ev.push_front(pkt);
return x;
}
void testrauschen::on_pushButton_2_clicked()
{
fileName = QFileDialog::getOpenFileName(this,
tr("Bild auswählen"), "", tr("png Files (*.png)"));
}
void testrauschen::on_horizontalSlider_valueChanged(int value)
{
on_pushButton_clicked();
}