[C++] Bild analysieren

M--G

Lieutenant
Registriert
Dez. 2006
Beiträge
772
Guten Abend,
nachdem nun endlich die Basis richtig zu laufen scheint, ist es Zeit für den nächsten Schritt! :)
Danke nochmal an alle, die mir bis hierhin geholfen haben!!!

Vor einigen Tagen hatte ich das schonmal versucht, damals hatte es mit OpenCV + DevC++ nicht geklappt (und ich bin fast wahnsinnig geworden, nach stundenlangen Versuchen mit so ziemlich jeder Version ;) ).
Momentan habe ich immerhin CImg mit Visual Studio zum Laufen gebracht :)

Also bei folgenden Baustellen bräuchte ich als nächstes Hilfe:

1.Bild einlesen:
- wie gebe ich den Bildnamen ein, oder öffne ich das Bild?
mit cin bin ich momentan auf einen Buchstaben beschränkt ;)

- brauche ich dafür noch etwas außer CImg, oder was würdet ihr mir empfehlen?
Interessieren tuen mich "nur" die Rot, Gruen und Blau Werte der einzelnen Pixel und die Höhe und Breite des jpg-Bildes.

- lieber Llano oder Bulldozer für meine Diplomarbeit im Herbst?
(Scherz *gg*)

Vielen vielen Dank!
Ohne euch würde ich nicht voran kommen!
Werdet bei den Danksagungen in meiner Studienarbeit erwähnt :daumen:
(Analyse des lokalen Wärmeübergangs mit thermochromatischen Flüssigkristallen 95% fertig, nun raubt mir nur noch die Programmierung den letzten Nerv ^^)
 
Zuletzt bearbeitet:
http://openil.sourceforge.net/ wäre noch eine alternative zu CImg - gut dokumentiert und einfach - nicht unbedingt super schnell...

Du kannst Dateinamen sehrwohl mit cin einlesen - aber ich würde an deiner Stelle einfach agrc und argv nutzen - also der .exe parameter übergeben das sollte einfacher sein.

Edit:
Hatte nochn bissel Code zu dem Thema rumliegen vielleicht Hilft dir das (können Bugs drin sein...)
Code:
#include <iostream>
#include <string>
#include <IL/il.h>
#include <IL/ilu.h>

using namespace std;

class DevIL {
    public:

    static void Initialize();
};

void DevIL::Initialize() {
    ilInit();
    iluInit();
}

class DevImage {
    public:
    DevImage();
    DevImage(std::string filename);

    bool LoadImage(std::string filename);
    bool SaveImage(std::string filename);

    int GetInfo(ILenum info);
    ILubyte* RawData();
    private:
    ILuint imageName;
};

DevImage::DevImage() {
    imageName = ilGenImage();
}

DevImage::DevImage(std::string filename) {
    imageName = ilGenImage();
    LoadImage(filename);
}

bool DevImage::LoadImage(std::string filename) {
    ilBindImage(imageName);
    ilLoadImage(filename.c_str());
}

bool DevImage::SaveImage(std::string filename) {
    ilBindImage(imageName);
    ilSaveImage(filename.c_str());
}

int DevImage::GetInfo(ILenum info) {
    ilBindImage(imageName);
    return ilGetInteger(info);
}

ILubyte* DevImage::RawData() {
    ilGetData();
}

int main(int argc, char** argv) {
    
    DevIL::Initialize();
    std::cout<<"Initialized\n";
	
	if(argc > 1) {
		DevImage test(argv[1]);

		std::cout<<"Loaded.\n";

		ILubyte *data = test.RawData();
		std::cout<<(int)data[0]<<" "<<(int)data[1]<<" "<<(int)data[2]<<std::endl;
	}
    
	
    return 0;
}
 
Zuletzt bearbeitet:
hier mal ein anderer vorschlang

Code:
#include <QFileDialog>
#include <osgDB/ReadFile>

//blabla.. in irgend einer methode dann das:

QString fileName = QFileDialog::getOpenFileName(this,
     tr("Open Image"), "", tr("Image Files (*.png *.jpg *.bmp)"));

if (!fileName.isNull())
	{
		osg::ref_ptr<osg::Image> image = osgDB::readImageFile(fileName.toStdString());
		osg::Vec4 color = image->getColor(osg::Vec2(10, 12)); //halt die x, y koordinaten
		unsigned char a = color.a();
		unsigned char r = color.r();
		unsigned char g = color.g();
		unsigned char b = color.b();
//blabla.. dein analyse-code
		image = NULL;
	}

unterstützte bildformate entnimmst aus der zweiten tabelle von hier.

das osg bekommst als installer von hier.
das qt bekommst als installer von hier.
ein qt-addin für VS2008 bekommst von hier.

nach der installation setzt du die umgebungsvariablen wie folgt:
Code:
OSG_BINARY_DIR =..\OpenSceneGraph\bin;..\OpenSceneGraph\share\OpenSceneGraph\bin
OSG_FILE_PATH = ..\OpenSceneGraph\data
OSG_INCLUDE_PATH = ..\OpenSceneGraph\include
OSG_LIB_PATH = ..\OpenSceneGraph\lib
OSG_NOTIFY_LEVEL = DEBUG
OSG_ROOT = ..\OpenSceneGraph
QTDIR = ..\Qt\4.7.3
PATH = %QTDIR%\bin;%OSG_BINARY_DIR%

pfade im linker wären dann wie folgt:
Code:
"$(QTDIR)\lib";"$(OSG_LIB_PATH)";

den teil für qt wird dir das addin bereits konfigurieren, wenn du ein neues qt-projekt erstellst.

die notwendigen libs für osg wären diese hier, anderenfalls wirds einfach zu erkennen sein, ob noch was fehlt.
Code:
osgd.lib
osgDBd.lib

das ganze ließe sich auch ohne osg lösen, fand nur auf die schnelle kein passendes snippet, das lediglich auf qt aufbaut.

jedenfalls ist der vorteil, dass du es nur einmal konfigurieren musst und dafür alles denkbare für deine zwecke und viel mehr erhälst.
 
Zuletzt bearbeitet:
Guten Morgen

Ok, danke :)
Scheint also keine einfache Lösung mit Header only... zu geben ;)

Noch andere Vorschläge, wie ich am einfachsten an die Rot, Gruen und Blau Werte der einzelnen Pixel und die Höhe und Breite des jpg-Bildes rankomme? Oder welchen der oberen Vorschläge ich zuerst probieren sollte? ^^
 
wegen des JPG-Formats müsstes du nochmal schauen, welche Libs/ Apps für CImg benötigt um damit umgehen zu können. Ansonsten könnte der nachfolgende Source dir schon weiterhelfen.

Code:
#include <iostream>
#include <stdlib.h>
#include <sstream>
#include <string>

#include <CImg.h>

using namespace cimg_library;


void image_demo(const std::string& file_name) {
  
	CImg<float> src(file_name.c_str());

	// Schleife ueber alle Pixel
        // hier Hoehe und Breite des Bildes (src.height(), src.width())
	const int wh = src.width()*src.height();

        // Pointer in Bilddaten
        float* data = src.data()
	cimg_forXY(src, x, y) {
		
		// loesche rot
                data[x+y*src.width()+0*wh] = 0.0;

		// loesche gruen
                data[x+y*src.width()+1*wh] = 0.0;

		// Zugriff auf blau
                // data[x+y*src.width()+2*wh] = 0.0;
	}

	CImgList<float> images(src);
	CImgDisplay disp(images, file_name.c_str());
	char c;
	std::cin >> c;
}

int main(int argc, char* argv[]) {
	std::string file_name;
	std::cout << "Bilddatei mit vollstaendigen Pfad:";
	if(std::cin >>  file_name)
		image_demo(file_name);
	return 0;
}
 
Zuletzt bearbeitet:
M--G schrieb:
Vor einigen Tagen hatte ich das schonmal versucht, damals hatte es mit OpenCV + DevC++ nicht geklappt (und ich bin fast wahnsinnig geworden, nach stundenlangen Versuchen mit so ziemlich jeder Version ;) ).
Momentan habe ich immerhin CImg mit Visual Studio zum Laufen gebracht :)

Du brauchst nen sauberen Arbeitsstil. Rumprobieren ist Mist ;)

M--G schrieb:
1.Bild einlesen:
- wie gebe ich den Bildnamen ein, oder öffne ich das Bild?
mit cin bin ich momentan auf einen Buchstaben beschränkt ;)

Kauf dir ein Buch über C++ Programmierung. Da steht auch drin wie du Befehlszeilen-Argumente behandelst. cin impliziert interaktives Programm. Meistens ist Batchprogramm aber sinnvoller, und das geht zur Steuerung niemals über stdin.



M--G schrieb:
- brauche ich dafür noch etwas außer CImg, oder was würdet ihr mir empfehlen?
Interessieren tuen mich "nur" die Rot, Gruen und Blau Werte der einzelnen Pixel und die Höhe und Breite des jpg-Bildes.

Kann jede JPG-Library. "Rot, Gruen und Blau Werte der einzelnen Pixel" ist allerdings "interpretierfähig". Es gibt ganz unterschiedliche Arten ein Bild im Speicher darzustellen. Sowohl was das Memorylayout angeht, als auch Datentypen der Pixel und Pixelformat. Was du vermutlich haben willst ist RGBA 32-Bit als Integer.



M--G schrieb:
- lieber Llano oder Bulldozer für meine Diplomarbeit im Herbst?
(Scherz *gg*)

Weder noch :evillol:
 
IceMatrix schrieb:
Du brauchst nen sauberen Arbeitsstil. Rumprobieren ist Mist ;)

Kauf dir ein Buch über C++ Programmierung. Da steht auch drin wie du Befehlszeilen-Argumente behandelst. cin impliziert interaktives Programm. Meistens ist Batchprogramm aber sinnvoller, und das geht zur Steuerung niemals über stdin.

So gleich geht das würfeln los, womit ich anfange ^^

C++ und C Buch habe ich von der Uni...
Aber die sind sehr unanschaulich und krank :D
Danke nochmal an all die Vorschläge!
 
M--G schrieb:
C++ und C Buch habe ich von der Uni...
Aber die sind sehr unanschaulich und krank :D

Dann hast du entweder
- Das falsche Buch
- Die falsche Einstellung zum Thema

C++ ist für meine Begriffe _wesentlich_ intuitiver als andere verbreitete Sprachen.
 
IceMatrix schrieb:
C++ ist für meine Begriffe _wesentlich_ intuitiver als andere verbreitete Sprachen.

Im großen und ganzen finde ich das auch (obwohl viele Leute das natürlich ganz anders sehen). Man muß aber fairerweise dazusagen, daß C++ auch eine ganze Menge richtig fieser Stolperfallen parat hat. Klar, irgendwann hat man dann so viel Erfahrung gesammelt, daß man gelernt hat, diese Fallen zu vermeiden ... aber das dauert eben teilweise recht lang. Bei mir hat's gut 6 Jahre gedauert, bis ich soweit war. Und selbst nach 11 Jahren C++ gibt es immer noch einige Aspekte der Sprache, die mich hin und wieder überraschen. :freak:

Aber trotz allem gibt es keine Sprache, mit der ich lieber arbeite als mit C++.
 
Habe mir gerade mal OpenCV nochmal angeschaut (youtube sei dank)

http://www.youtube.com/watch?v=XeBhwbRoKvk

Wenn das immer so kompliziert ist, wunder ich mich nicht, wieso ich das ohne Beschreibung nicht hinbekomme :(

Cimg.h habe ich mir auch nochmal angeschaut, da mir der Part mit dem Cursor gut gefällt:
http://cimg.sourceforge.net/reference/group__cimg__tutorial.html

Aber dazu brauche ich wieder ein riesen Programm, für das es keine Installationsbeschreibung gibt...
http://www.imagemagick.org/script/magick++.php

Bin ich blöd, oder habt ihr auch Probleme damit das ganze zum Laufen zu bringen?
 
Ohne mir das nun genau angeschaut zu haben, möchte ich anmerken, dass wohl kein Weg daran vorbeiführen wird, dich genauer mit C++ zu beschäftigen, wenn du das ernsthaft betreiben willst.
 
Die Erfahrung habe ich mit CImg auch gemacht - openil ist da Pflegeleichter ;)
Wobei ich sagen muss das ich damals MingW nutzen musste - glaube mit Visual Studio ist auch Magick++ recht flott gebaut , kannste glaub einfach das Projekt importieren oder die binary distribution nutzen.
 
Imagemagick unter Windows mittels binary-package installieren, d.h. in meinen Fall die runtergeladene Exe ausführen und ein paarmal ok drücken. Dann Pfad auf Imagemagick-Verzeichnis [Umgebungsvariable path unter Windows] eintragen und schon funktioniert CImg auch mit Jpg-Bildern. Für andere Systeme stehen auch Binaries zu Download bereit.
Auf welchen System entwickelst du?
 
Zuletzt bearbeitet:
M--G schrieb:
Bin ich blöd, oder habt ihr auch Probleme damit das ganze zum Laufen zu bringen?

Blöd vermutlich nicht. Aber du spielst hier mit Sachen rum ohne sie zu verstehen. Und verständnis ist für Softwareentwicklung unbedingt nötig.
Eine "Installationsanleitung" für ImageMagick++ ist für einen Programmierer (und für die wurde das entwickelt) völlig unnötig. Der weiß nämlich wie er damit umzugehen hat.

Außerdem wird hier sehr wohl eine Anleitung angeboten: http://www.imagemagick.org/Magick++/Install.html

Du solltest dich _dringend_ intensiv mit dem Thema C/C++ Programmierung beschäftigen wenn du sowas für deine Diplomarbeit verwenden willst. Ich kann dir versprechen dass du andernfalls ganz böse auf die Nase fällst.
 
Keine Sorge, ist für die Diplomarbeit nicht nötig.
Muss nur mein Thema asap (as soon as possible) abschließen, sonst muss ich mit meiner Diplomarbeit noch 1 Semester warten *grummel*

Jetzt die Ultimate Version von VS installiert und hoffe, dass nun auch OpenCV solangsam will und dann bald C++ vom Tisch ist ;)

Danke nochmal für die bisherige Hilfe und für die zukünftige!
:)
 
Zurück
Oben