Ich versuche, um 90 Grad gegen den Uhrzeigersinn zu drehen und dann horizontal spiegeln.Arm Neon transponieren 4x4 uint32
Mein erster Ansatz war nur OpenCV zu verwenden:
cv::transpose(in, tmp); // transpose around top left
cv::flip(tmp, out, -1); // flip on both axes
Für Leistung, ich versuche, die beiden Funktionen in einem verschmelzen.
Mein Code:
void ccw90_hflip_640x480(const cv::Mat& img, cv::Mat& out)
{
assert(img.cols == 640 && img.rows == 480);
assert(out.cols == 480 && out.cols == 640);
uint32_t* imgData = (uint32_t*)img.data;
uint32_t* outData = (uint32_t*)out.data;
uint32_t *pRow = imgData;
uint32_t *pEnd = imgData + (640 * 480);
uint32_t *dstCol = outData + (480 * 640) - 1;
for(; pRow != pEnd; pRow += 640, dstCol -= 1)
{
for(uint32_t *ptr = pRow, *end = pRow + 640, *dst = dstCol;
ptr != end;
++ptr, dst -= 480)
{
*dst = *ptr;
}
}
}
dachte ich, die oben schneller sein würde, aber es ist nicht. Ich kann mir keinen Grund vorstellen, dass es nicht schneller wäre, neben OpenCV möglicherweise NEON zu verwenden.
fand ich diesen Artikel/Präsentation: http://shervinemami.info/NEON_RotateBGRX.swf
Die Umsetzung und Flipping sind so verschwommen zusammen, dass es sehr schwer macht, zu ändern, wo es in die andere Richtung drehen würde, und drehen um die horizontale Achse wie Ich brauche es auch. Der Artikel ist sehr alt, also hoffe ich, dass es einen einfacheren Weg gibt, das zu tun, was ich brauche.
Also, was ist der einfachste Weg, um eine 4x4-Matrix von UINT32 mit Arm NEON zu transponieren?
_ "Für die Leistung" _? Wie haben Sie festgestellt, dass diese Bemühungen zu einem leistungsfähigeren Programm führen werden? –
Tatsächlich bin ich in die Zukunft gereist, wo ich bestätigt habe, dass meine Armneonimplementierung schneller ist. Bevor ich den Algorithmus aufschreiben konnte, funktionierte meine Zeitmaschine leider nicht mehr und schickte mich in ein alternatives Universum, in dem jeder verknüpfte Listen anstelle von Vektoren verwendet. – bitwise
Siehe [hier] (https://community.arm.com/thread/3002) für Lösungen (scrollen Sie etwas nach Code, der tatsächlich funktioniert). –