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:
Ergebnis
Erwartete Ergebnisse:
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.
was ist diese Linie 'size_t memsize = 3 * image.rows * image.cols;' ? speziell, '3'? –
@SouravGhosh Ich vermute, es ist 3 Bytes pro Pixel für die R, G, B-Komponenten. –
@TheParamagneticCroissant in diesem Fall, ist nicht wie 'twoTimesImage' fehlt ein Multiplikator 2 für' image.rows'. Reine Vermutung. –