Ich bin total überrascht von all Ihren Antworten. Vielen Dank!Effizienz der Summierung von Bildern mit MATLAB und OpenCV
Der Fehler-Code wird wie folgt gezeigt: percentage = (double)kk * 100.0/(double)totalnum;
Nachdem ich es geändert zu: percentage = (double)kk * 100.0/totalnum;
das Problem gelöst ist. Und diese einfache Teilung verbrauchte etwa 90 von 150. Vielleicht Division zwischen Doppel und Int ist schneller als es zwischen verdoppelt.
Nochmals vielen Dank für Ihre Antworten!
Ich versuche, das durchschnittliche Bild von einer Reihe von Bildern zu bekommen, die von einem Video kommen. Es gibt nur 2 Schritte für diesen Job:
- Summieren Sie alle Bilder in eine Matrix.
- Teilen Sie die Matrix nach der Anzahl der Bilder.
habe ich folgenden Code in OpenCV: (C++)
Mat avIM = Mat::zeros(IMG_HEIGHT, IMG_WIDTH, CV_32FC3);
for (ii = startnum; ii <= endnum; ii += interval) {
string fullname = argv[1];
sprintf(filename, "\\%d.png", ii);
fullname.append(filename);
Mat tempIM = imread(fullname.c_str());
if (tempIM.empty()) { cout << "Can't open image!\n"; return -1; }
tempIM.convertTo(tempIM, CV_32FC3);
avIM += tempIM; //Sum up every image
++kk;
}
avIM = avIM * (double)(1.0/kk); //get average'
Und folgenden Code in Matlab: (2015a)
avIM = zeros(size(imread([im.dir,'\',num2str(startnum),'.png'])));
pointIdx = startnum:interval:endnum;
for j=pointIdx,
IM = imread([im.dir,'\',num2str(j),'.png']);
avIM = avIM + double(IM); %Sum up every image
end
avIM = uint8(round(avIM./size(pointIdx,2))); %get average
Aber wenn ich die beiden Programme auf 2.100 Bilder laufen, OpenCV nahm 150,3s (Release) und MatLab nahm 103.1s. Es hat mich wirklich verwirrt, dass ein C++ Programm langsamer als ein MatLab Skript läuft.
Also was verlangsamt mein OpenCV-Programm? Wenn es durch meine Methode des Matrixzugriffs verursacht wird, was sollte ich tun, um die Effizienz zu verbessern?
1. ist es möglich, dass Sie in den Debug-Modus statt Freigabemodus laufen in Visual Studio? ändere es in den Freigabemodus und starte das Programm mit Strg + F5 2. Ist die Konvertierung in float notwendig? kannst du ursprünglich bei float lesen? – drorco
1. Ja, es ist ein Freigabemodus. 2. In der Tat, ich verwandle nur jemandes Code in C++ und ich sah, dass es eine (doppelte) vor IM gibt. Also ich denke, ich brauche eine float-artige Matrix zum Summieren dieser Bilder. –
Ein anderes mögliches Problem: Wo sind Ihre Bilder? ist es möglich, dass sie sich auf einer externen Festplatte befinden? – drorco