2015-07-28 8 views
6

Ich muss ein Bild erstellen, das doppelt so viele Spalten wie das Originalbild enthält. Daher habe ich die Breite des neuen Bildes zweimal so groß wie die des ursprünglichen Bildes gehalten.Die durch memcpy() erstellte Kopie

Obwohl dies eine sehr einfache Aufgabe ist und ich es bereits getan habe aber Ich wundere mich über die seltsamen Ergebnisse, die durch diese Aufgabe mit memcpy() erhalten.

Mein Code:

int main() 
{ 

    Mat image = imread("pikachu.png", 1); 
    int columns = image.cols; 
    int rows = image.rows; 

    Mat twoTimesImage(image.rows, 2 * image.cols, CV_8UC3, Scalar(0)); 

    unsigned char *pSingleImg = image.data; 
    unsigned char *ptwoTimes = twoTimesImage.data; 

    size_t memsize = 3 * image.rows*image.cols; 

    memcpy(ptwoTimes , pSingleImg, memsize); 
    memcpy(ptwoTimes + memsize, pSingleImg, memsize); 

    cv::imshow("two_times_image.jpg", twoTimesImage); 

    return 0; 
} 

Originalbild:

image1

Ergebnis

image2

Erwartete Ergebnisse:

image3

Frage: dann Wenn das resultierende Bild nur zwei Mal auf die des ursprünglichen Bildes ist, wie kommt es 4 Originalbilder werden immer in das neue Bild kopiert ? Zweitens kopiert die memcpy() die kontinuierliche Speicherstelle in einer reihenweisen Weise, entsprechend sollte ich ein Bild erhalten, das in den "Erwarteten Ergebnissen" gezeigt wird.

+0

was ist diese Linie 'size_t memsize = 3 * image.rows * image.cols;' ? speziell, '3'? –

+3

@SouravGhosh Ich vermute, es ist 3 Bytes pro Pixel für die R, G, B-Komponenten. –

+0

@TheParamagneticCroissant in diesem Fall, ist nicht wie 'twoTimesImage' fehlt ein Multiplikator 2 für' image.rows'. Reine Vermutung. –

Antwort

7

Die linke Katze besteht aus den ungeradzahligen Zeilen und die rechte Katze besteht aus den geradzahligen Zeilen des Originalbildes. Dies wird dann verdoppelt, so dass zwei weitere Katzen darunter liegen. Die neuen Katzen haben die halbe Anzahl der Linien der ursprünglichen Katze.

Das neue Bild wird wie folgt aufgebaut:

line 1 line 2 
line 3 line 4 
line 5 line 6 
...  
line n-1 line n 
line 1 line 2 
line 3 line 4 
line 5 line 6 
...  
line n-1 line n 
+9

Die "Katze" ist eindeutig ein [Pikachu] (https://duckduckgo.com/?q=pikachu&t=opera&ia=images). – nwp

5

die Antwort von „Klas Lindbäck“ versehen absolut korrekt ist. Nur um jemandem, der eine ähnliche Verwirrung hat, mehr Klarheit zu geben, schreibe ich diese Antwort. Ich habe ein Bild mit ungeraden Reihen aus roten und geraden Reihen aus blauer Farbe erstellt.

Dann habe ich den Code in meinem ursprünglichen Beitrag verwendet. Wie von der Antwort von "Klas Lindbäck" erwartet, kam die rote Farbe in die erste Kolonne und die blaue Farbe in die zweite Kolonne.

Originalbild:

image

resultierende Bild:

image2