Also von Geschwindigkeit ist gerade noch keine Rede. Enen Seam zu entfernen dauer ca. 15 Sekunden. Aber es funktioniert.Mich wundert es das ich das mit meinen 14 Jahren und ca 3/4 Jahren Erfahrung geschaft habe. Ich habe das Projekt angehangen. Vieleicht kannst du dir das mal Anschauen.
Also der langsame Teil ist in dem Thread die zweite Schleife.
PS : Ich sehe gerade auf der verlinkten Seite das dort steh das ein Teil in Python geschrieben ist8)
Juhu
Es geht!
Somit bin ich meinen Recherchen nach der erste der das in C# nachgebildet hat8)
Jetzt muss ich das nur noch perfomanter machen. Und noch ein par Kommentare reinpacken. Dann werde ich das Projekt online stellen.
Ja hab ich. Die ähneln sich aber nicht wirklich. Ich hab aber nochmal gegoogled. Ich hab jetzt eine Bibliothek gefunden die die die Kantenerkennung durchführt(Link).
Nochmal zu dem Algorithmus :
Zuerst wird eine Kantenerkennung durchgeführt.(Siehe oben) Danach werden den Pixeln die nahe der Kanten liegen höhere Werte zugeteilt.(Das nennt man dann Energiebild). Zum Schluss werden dann Pfade durch die Pixel mit den niedrigeren Weten (Seams) gefunden und gelöscht.
Der Algorithmus ist also garnicht so schwer. Ich frag mich nur warum nicht vorher jemand auf die Idee gekommen ist. Ich melde mich nochmal wenn ich nicht mehr weiterweiß.
Ich habe versucht mit dem Energiebild, welches ich mit dem oben geposteten Code erstellt habe, die Pixel zu ermittel die nicht gebraucht werden.Dazu habe ich zuerst in der ersten Spalte von oben von links nach rechts den Pixel mit dem nidrigsten Wert zu ermitteln. Dann gehe ich in einer Schleife jedes mal einmal nach unten und Suche Dort den niedrigsten, der vom x-Wert höchstens eins Abweicht.
Das Problem ist, dass ich das Energiebild wahrscheinlich falsch berrechnet habe, denn ich bekomme bei fast jedem Pixel den Gleichen Wert raus. Und außerdem weiß ich nicht ob ic den mögliche Unterschied bei dem x Wert vergrößern muss(z.B. 2).
Ich hoffe jemand versteht mein Problem.
Ich hab mir das mal angeguckt, aber bei C++ steh ich auf dem Schlauch. Außerdem lässt sich der Code nicht compipieren. Vieleicht hat sich das doch einer schon angeschaut und kann mir einen Tip geben.
trotzdem Danke
Hallo zusammen,
Ich möchte ein Programm mit Seam Carving schreiben. ICh habe auch schon angefange und habe ein Energiebild berrechnet.
Jetzt komme ich aber nicht sorecht weiter.
Vieleicht hat ja einer eine Idee wie man da machen kann. Noch eine Idee von mir wäre Multithreading(Vieleicht mit den Parallel Extension?) Hier ist mein Code für das Energiebild :
//Das ist das Array für das Energiebild
//Hier wird für jedes Pixel eine Zahl
//gespeichert. Das wird genutzt um nachher die
//Pixel die nicht gebraucht werden
//zu entfernen.
int[,] EnergieBild;
private void ErstelleEnergieBild()
{
//Initialisiere das Energiebild
EnergieBild = new int[pictureBox1.Image.Width, pictureBox1.Image.Height];
Bitmap map = (Bitmap)pictureBox1.Image;
int[,] bw = map.SchwarzWeiß();
int w = map.Width-1;
int h = map.Height - 1;
Parallel.For(0, w, i =>
{
for (int j = 0; j < h; j++)
{
EnergieBild[i, j] = GetEnergie(bw, j, i);
//int ener = EnergieBild[i, j] + 100;
//((Bitmap)pictureBox1.Image).SetPixel(i, j, Color.FromArgb(ener,ener,ener));
}
});
}
private int GetEnergie(int[,] bit, int i, int j)
{
List<int> templist = new List<int> );
templist.Add(bit[j,i]);
if (i != 0)
{
templist.Add(bit[j, i - 1]);
if (j != 0)
{
templist.Add(bit[j - 1, i - 1]);
}
}
if (j != 0)
{
templist.Add(bit[j - 1, i]);
if (i > bit.GetLength(1) - 1)
{
templist.Add(bit[j - 1, i + 1]);
}
}
if (i > bit.GetLength(1) - 1)
{
templist.Add(bit[j, i + 1]);
if (j < bit.GetLength(0) - 1)
{
templist.Add(bit[j + 1, i + 1]);
}
}
if (j < bit.GetLength(0) - 1)
{
templist.Add(bit[j + 1, i]);
if (i > 0)
{
templist.Add(bit[j + 1, i - 1]);
}
}
int u = 0;
int temp = 0;
foreach (int x in templist)
{
temp += x;
}
temp /= templist.Count;
u = Math.Abs(temp - bit[j, i]);
return u;
}
Also ich hatte das fürn Netzwerkspiel gebraucht.
Müsstest du eventuel anpassen :
[/b]
public void Start()
{
try
{
// Set the TcpListener on port 13000.
IPAddress localAddr = IPAddress.Parse(Dns.Resolve(Dns.GetHostName()).AddressList[0].ToString());
IPEndPoint ep = new IPEndPoint(localAddr,port);
// TcpListener server = new TcpListener(port);
TcpListener server = new TcpListener(ep);
// Start listening for client requests.
server.Start();
// Buffer for reading data
//String data = null;
// Enter the listening loop.
client = server.AcceptTcpClient();
Connected(ClorLi.Listener);
NetworkStream str = client.GetStream();
while (true)
{
Thread.Sleep(500);
if (str.DataAvailable)
{
byte[] buffer = new byte[256];
str.Read(buffer, 0, 256);
string erg = Encoding.Default.GetString(buffer);
Get(erg);
}
}
}
catch (SocketException e)
{
MessageBox.Show(e.Message);
}
}
[b]
Halllo,
ich bin jetzt 14 und programmiere jetzt seit ca. einem halben Jahr C# und davor ein viertel Jahr VB.Ich muss sagen ich habs schnell kapiert und kann jetzt nicht mehr aufhören .
Am Anfang hatte ich zwar einige Probleme aber ich habs auf die Reihe bekommen(Google ist mein Freund).
Jetz versteh ich was du meinst.Bin aber leider überfragt.Wende dich mal an den Hersteller des Controls. Oder suche nochmal im Context also Control. ...
Jede Form und jedes Control hat Drag Events zb this.DragOver Damit müsste man das machen.Hab ich selber aber noch nich ausprobiert. Versuch ich jetzt auch mal
edit : Hab grad rausgefunden man muss erst this.AllowDrop = true;
Ich bleibe lieber bei der Schleife. Ich hab das gerade nochmal mit dem Timer ausprobiert, aber jetzt klappt garnichts mehr.Erstens musste ich meinen ganzen Code umschreiben.Und Zweitens wird der nicht ausgeführt.
Die Schleife funktioniert. 0% Auslastung sind auch in Ordnung.Und ich glaube jeder kann auf die Antwort eine halbe Sekunde warten
Danke,
Ich hatte das mit dem Timer schonmal probiert.Hab ich irgendwie nicht hinbekommen. Auf Thread.Sleep bin ich garnicxh gekommen. Gute Idee. Hab ich eingebaut. Und sehe da 0%.
Hallo zusammen,
Ich habe eine Frage und zwar habe ich ein Netzwerkspiel programmiert.Das klappt zwar, aber eine Methode wartet in einem anderen Thread auf Daten das sieht so aus
public void Start()
{
try
{
IPAddress localAddr = IPAddress.Parse(
Dns.Resolve(Dns.GetHostName())
.AddressList[0].ToString());
IPEndPoint ep = new IPEndPoint(localAddr,port);
TcpListener server = new TcpListener(ep);
// Start listening for client requests. server.Start();
// Buffer for reading data
// Enter the listening loop.
client = server.AcceptTcpClient();
Connected(ClorLi.Listener);
NetworkStream str = client.GetStream();
//Hier liegt das Problem
while (true)
{
if (str.DataAvailable)
{
byte[] buffer = new byte[256];
str.Read(buffer, 0, 256);
string erg = Encoding.Default.GetString(buffer);
Get(erg);
}
}
}
catch (SocketException e) {
MessageBox.Show(e.Message);
}
}
Die Methode verbraucht an dieser stelle 25% Prozent CPU Leistung(Ich hab nen QuadCore also einer ist voll ausgelastet.Ich frag mich was wol bei nem SingleCore passiert)
weiß jemand wie man das optimieren kann?