WilliamSpiderWeb
Mitglied
Hallo,
ich steh ja selbst nicht auf so unspezifische Fragen *grml*,
aber ich glaub ich hab keine andere Wahl... also, wo ist der Fehler?
Vorgeschichte:
Im Speicher liegt ein Bild in einem unsigned char (m_charBild) der Größe 640*480*3. Der Einfachheit habe ich einen einfachen weißen Kreis auf einen schwarzen Hintergrund gemalt.
Dieses Bild möchte ich nun mit einer 3*3 Maske abtasten und das Ergebnis in ein neues char (BildX) speichern. Dadurch entsteht in BildX eine Abbildung des ersten Bildes, wo lediglich die die Kanten des Kreises weiß bzw. hellgrau sind und der Rest (Flächen/Regionen) schwarz bzw. dunkelgrau.
Realisierung:
Ergebnis:
Es funktioniert fast perfekt *grml*
Aber irgendwo muss ich mich "verzählt" haben.
Als Ergebnis erscheint ein Kreis (weiße Kanten) genau an der richtigen Stelle, aber leider auch der selbe Kreis noch einmal ca. ein drittel der Bildbreite nach rechts verschoben.
Ich hoffe die sehr knappe Zusammenfassung war verständlich.
Falls nicht, fragt einfach...
bitte um dringende Hilfe...
Gruß,
Alex
ich steh ja selbst nicht auf so unspezifische Fragen *grml*,
aber ich glaub ich hab keine andere Wahl... also, wo ist der Fehler?
Vorgeschichte:
Im Speicher liegt ein Bild in einem unsigned char (m_charBild) der Größe 640*480*3. Der Einfachheit habe ich einen einfachen weißen Kreis auf einen schwarzen Hintergrund gemalt.
Dieses Bild möchte ich nun mit einer 3*3 Maske abtasten und das Ergebnis in ein neues char (BildX) speichern. Dadurch entsteht in BildX eine Abbildung des ersten Bildes, wo lediglich die die Kanten des Kreises weiß bzw. hellgrau sind und der Rest (Flächen/Regionen) schwarz bzw. dunkelgrau.
Realisierung:
Code:
int Sobol(int P1, int P2, int P3, int P4, int P5, int P6, int P7, int P8, int P9)
{
//Sobol-Maske für vertikale (x) Kanten
int Result;
int S1 = -1;
int S2 = 0;
int S3 = 1;
int S4 = -2;
int S5 = 0;
int S6 = 2;
int S7 = -1;
int S8 = 0;
int S9 = 1;
Result = (S1*P1 + S2*P2 + S3*P3 + S4*P4 + S5*P5 + S6*P6 + S7*P7 + S8*P8 + S9*P9);
return(abs(Result));
}
void CMesssystemDlg::OnCmd3KantenDet()
{
int width = 640;
int height = 480;
int i;
div_t divResult;
BildX = new unsigned char[width * height * 3];
for (i=0; i<width*height*3; i+=3)
{
divResult = div(i/3,width);
if ((divResult.quot != 0) && (divResult.quot != height-1) && (divResult.rem != 0) && (divResult.rem != width-1))
{
BildX[i] = Sobol(m_charBild[i+width-1], m_charBild[i+width], m_charBild[i+width+1], m_charBild[i-1], m_charBild[i], m_charBild[i+1], m_charBild[i-width-1], m_charBild[i-width], m_charBild[i-width+1]);
BildX[i+1] = BildX[i];
BildX[i+2] = BildX[i];
}
else
{
BildX[i] = 0;
BildX[i+1] = 0;
BildX[i+2] = 0;
}
}
//Kopf/Header des Bildes erstellen
BITMAPINFO bmi;
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = width;
bmi.bmiHeader.biHeight = height;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 24;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = 0;
bmi.bmiHeader.biXPelsPerMeter = 1000;
bmi.bmiHeader.biYPelsPerMeter = 1000;
bmi.bmiHeader.biClrUsed = 0;
bmi.bmiHeader.biClrImportant = 0;
//"Zeichenblatt" holen
CClientDC dc(this);
//Bild anzeigen
HBITMAP hBitmap;
hBitmap = CreateCompatibleBitmap(dc,width,height);
SetDIBits(dc, hBitmap, 0, height, BildX, &bmi, DIB_PAL_COLORS);
pMyDlg->m_cCam.SetBitmap(hBitmap);
}
Ergebnis:
Es funktioniert fast perfekt *grml*
Aber irgendwo muss ich mich "verzählt" haben.
Als Ergebnis erscheint ein Kreis (weiße Kanten) genau an der richtigen Stelle, aber leider auch der selbe Kreis noch einmal ca. ein drittel der Bildbreite nach rechts verschoben.
Ich hoffe die sehr knappe Zusammenfassung war verständlich.
Falls nicht, fragt einfach...
bitte um dringende Hilfe...
Gruß,
Alex