קיימת מחלוקת בין החוקרים לגבי מספר הלוחמים הרומאים בקרב. רוב החוקרים, וביניהם וולבנק, מאמצים את גישתו של פוליביוס וטוענים שהיו בקרב 8 לגיונות רומאים ועוד 8 לגיונות של בעלות הברית, סך הכול כ-80,000 רגלים וכ-6,000 פרשים. לעומתם, דה סנקליס ובעקבותיו גם ברנט המסתמכים על טיטוס ליוויוס, טוענים שבקרב השתתפו רק 4 לגיונות מתוגברים מאזרחי רומא, ועוד כמספר הזה מצד בעלות הברית. לשיטתם של החוקרים האלה, כלל הצבא הרומאי רק כ-55,000 חיילים. למרות הפירושים המאוחרים של ההיסטוריונים המודרניים למה שנכתב אצל ליוויוס, גם הוא נקב במספר גדול בהרבה מהערכותיהם לגבי גודלו של הצבא הרומאי, והעמיד אותו על 87,200 לוחמים חרף המחלוקת, מרבית ההיסטוריונים מאמצים את גישתו של פוליביוס ומונים בצד הרומי 80,000 רגלים ו-6,000 פרשים.
ברפובליקה הרומית לא הייתה הפרדה בין הדרג הפוליטי לפיקוד צבאי. ראשי המדינה (הקונסולים) היו ראשי הצבא בפועל בשדה הקרב. כל שנה נבחרו שני קונסולים, וכל אחד מהם קיבל פרובינקיה מסוימת עם מינויו. לפי מיקום הפרובינקיה היה הקונסול מקבל כוחות צבא לפי הצורך. צבא קונסולרי תקני כלל שני לגיונות רומאים וכוחות בעלות הברית, בסך הכול כ-20,000 רגלים וכ-2,000 פרשים. אם המצב דרש זאת, ניתן היה להכפיל את הכוח העומד לרשות הקונסול. לעיתים נדירות, כפי שהתרחש בקרב קאנאי, התייצבו שני הקונסולים לקרב אחד בכוחות משולבים. אם שני הקונסולים היו נוכחים, היה הפיקוד נתון לאחד מהם לפי הטלת גורל יומית, או שהתחלף מדי יום – כמו שקרה בקרב קאנאי: בימים הזוגיים פיקד אחד הקונסולים, ובימים האי-זוגיים חברו.
קיימת מחלוקת מסוימת גם בקשר לזהות המפקד הרומי ביום הקרב. פוליביוס מוסר שהפיקוד היה נתון בידיו של גאיוס טרנטיוס וארו, שבחר להילחם בתנאים לא נוחים לרומאים. פוליביוס מהלל את הקונסול השני, לוקיוס אמיליוס פאולוס ואת גבורתו, ומציג את וארו כטיפש שהביא את התבוסה על הרומאים ואף ברח בסוף הקרב על מנת להציל את נפשו. אלו הסוברים שפאולוס פיקד על הצבא ביום הקרב, טוענים שפוליביוס מייחס את התבוסה לווארו עקב קשריו עם פובליוס קורנליוס סקיפיו איימיליאנוס, נכדו של פאולוס. לכן, כך נטען, היה לו מניע לשבח את סבו של חברו ופטרונו. עם זאת, פוליביוס לא חושש למתוח ביקורת על בני המשפחה, וגם מקורות אחרים תומכים בכך שווארו פיקד באותו יום. יתר על כן, נראה שההחלטה לצאת לקרב התקבלה על ידי הסנאט ולא על ידי אחד המפקדים. מרבית החוקרים מסכימים שווארו הוא שפיקד על הצבא הרומי בקרב זה.
בקרב עצמו פיקד וארו על פרשי בעלות הברית באגף הימני של הקו הרומי. פאולוס לקח על עצמו את הפיקוד על הפרשים הרומים באגף השני. שני הקונסולים של השנה שעברה פיקדו על חיל הרגלים במרכז המערך הרומי.
הצבא הקרתגי ופיקודו.
הצבא הקרתגי היה מגוון הרבה יותר מהצבא הרומי. רק חלק קטן של הלוחמים הקרתגים באו מן העיר קרתגו עצמה, ואילו הרוב המכריע היו שכירי חרב בני ארצות רבות ושונות זו מזו. השליטה על צבא כזה, שהורכב מערב רב של לוחמים יוצאי רקעים שונים ודוברי שפות שונות, לא הייתה עניין של מה בכך. כישרונו של חניבעל כמפקד היה בכך שהצליח לצקת זהות לתוך תערובת לאומית זו ולהפיח בקרבה דבקות במשימה, נאמנות ועמידת גבורה נוכח הקשיים האדירים שהציבה בפניהם המלחמה בארץ זרה, בשירותה של מדינה שלא ראו מימיהם.
מרבית שכירי החרב שהרכיבו את הצבא היו גאלים ואיברים. הגאלים תרמו בעיקר לוחמים רגלים אימתניים, שהיו טובים בהתקפה, אך נטו לאבד במהרה את הלהט אם ההתקפה הראשונה לא צלחה. הם היו חמושים בחרב גדולה ובמגן גדול, אך לרוב חסרי שריון גוף. לצד החיילים הרגלים תרמו הגאלים גם פרשים כבדים. האיברים, בני עמים שונים, תרמו בעיקר חיל רגלים קל, אך גם רגלים החמושים בחרבות ובמגנים ומוגנים בשריון גוף. לצד הגאלים שירתו בחיל הרגלים קלעים בליאריים שנודעו בכושר הקליעה המעולה שלהם, וגדודים של בני קרתגו. לא ידוע מה היה החימוש המדויק של בני קרתגו, אך משערים שהיה דומה לחימוש ההופליט היווני. בני קרתגו לא שירתו בדרך כלל מחוץ לאפריקה וחיל הרגלים הכבד שליווה את חניבעל לקרב גויס, ככל הנראה, מקרב נתיניה של קרתגו מאפריקה ולא מבני קרתגו עצמם. בשלב זה של המלחמה, חיל הרגלים הכבד היה מצויד בנשק רומי שנלקח שלל בקרבות קודמים.
הן הגאלים והן האיברים תרמו את עיקר חיל הפרשים הכבד של חניבעל. חימושם היה אופייני לתקופה וכלל מיני כידוני הטלה, חרבות, שריון גוף ומגנים. בני קרתגו תרמו אף הם כמה מאות פרשים כבדים לצבא. הנומידים, שהיו בין טובי הרוכבים באגן המערבי של הים התיכון בעת העתיקה, השלימו את מצבת הפרשים בצבא ותרמו את עיקר חיל הפרשים הקל שחימושו העיקרי כידוני הטלה. פילי המלחמה ששרדו את המעבר דרך הרי האלפים נהרגו כבר בקרבות קודמים, ובקרב קאנאי לא השתתף אף פיל בצד הקרתגי.
לפי ההערכה המקובלת מנה צבאו של חניבעל בסך הכול כ-10,000 פרשים, מתוכם כ-4,000 פרשים נומידים קלים, כ-2,000 פרשים איברים ועוד כ-4,000 פרשים גאלים כבדים. כ-10,000 חיילים רגלים כבדים באו מלוב והיתר, כ-30,000 במספר, שכירי חרב כמפורט לעיל. מתוך 40,000 רגלים, מעריכים שכ-10,000 עד 12,000 היו קלים (קלעים, קשתים, מטילי כידונים וכיוצא באלה), כך שחיל הרגלים שהוצב במרכז המערך הקרתגי כלל כ-6,000 איברים והיתר גאלים – כ-12,000 עד 14,000 במספר. איכותם של החיילים האלה נפלה משמעותית מזו של יריביהם הרומאים. הערכה אחרת טוענת שהמספר של 40,000 רגלים מתייחס רק לרגלים שסודרו בקו המערכה העיקרי, ולא מתייחס לרגלים קלים שמספרם נע, לפי הערכה זו, סביב 8,000 חיילים.
בדומה לרומא, גם בני קרתגו בחרו את מנהיגיהם, אך אלו נשארו בקרתגו ולא יצאו למערכות. הפיקוד היה נתון בידיו של מצביא שקיבל רק הוראות כלליות ביותר מקרתגו והיה חופשי, למעשה, לפעול בכל דרך שימצא לנכון.
בקרב עצמו היה הפיקוד בצד הקרתגי נתון בידיו של חניבעל. הוא הגה את תוכנית הקרב והיה אדריכלה הראשי. לצדו עמדו עזרובעל (אין להתבלבל עם עזרובעל האחר, אחיו של חניבעל) בפיקוד על הפרשים הכבדים באגף הימני (השמאלי של רומאים), ומהרבעל שפיקד על הפרשים הנומידים באגף השני.
שדה הקרב.
מיקומו של שדה הקרב הידוע בשם "קרב קאנאי" עדיין שנוי במחלוקת. תיאור הקרב, כפי שהוא מופיע בכתבי ההיסטוריונים העתיקים פוליביוס וליוויוס, מבלבל ומעורפל בנקודה זו, ומותיר מקום רב לפרשנויות שונות, ולעיתים מנוגדות. שניהם כותבים שהקרב נערך על גדתו של נהר אופידוס (Aufidus), במרחק קצר מהנקודה בו הוא נשפך לים האדריאטי. רוב המחקרים המודרניים העוסקים בקרב מזהים את נהר אופידוס עם נהר אופנטו (Ofanto), הנמצא במחוז פוליה בדרום-מזרח איטליה. אולם מספר חוקרים סוברים, שהקרב נערך סמוך לנהר פורטורה (Fortore), שאף הוא נשפך לים האדריאטי, בגבול הצפוני של מחוז פוליה (אפוליה). המיקום המקובל של היישוב קאנאי, הוא על גבעה בגדה הדרומית של נהר אופנטו, כ-9 ק"מ ממערב לים האדריאטי.
מתיאור הקרב המופיע אצל פוליביוס קשה להבין אם הקרב התרחש בגדה הצפונית או בגדה הדרומית של הנהר. לפי תיאורו, הקרב התרחש בגדה המזרחית של הנהר, לא רחוק מהשפך שלו לים האדריאטי, כאשר הצבא הרומאי נערך כשפניו כלפי דרום, ואילו הצבא הקרתגני נערך כשפניו כלפי צפון (הערכות שגרמה לכך, שאף אחד מהצדדים היריבים לא סונוור מהשמש, כאשר זו עלתה במזרח). ליוויוס מוסיף פרט נוסף לתיאור זה, וכותב שהצבא הקרתגני היה בגבו לרוח יבשה המכונה בשם "וולטורנוס" (רוח הנושבת מכיוון דרום-מזרח), רוח אשר נשאה עימה אבק רב, והגבילה את הראות של הצבא הרומאי, כאשר זה המתקדם במהלך הקרב. רמז נוסף למיקום שדה הקרב ניתן למצוא בהזכרת שמות היישובים אליהם נמלטו שרידי הצבא הרומאי לאחר תבוסתו בקרב. יישובים אלו, קנוסיום וונוסה, נמצאים שניהם בגדה הדרומית של נהר אופנטו, מדרום-מערב למיקום המשוער של שדה הקרב.
תיאור שדה הקרב מתבסס בעיקר על כתבי ההיסטוריון פוליביוס, שכתב כשני דורות לאחר האירועים. לפי תיאורו הקרב נערך במישור ללא מכשולים טבעיים, כאשר האגף השמאלי של הצבא הקרתגני, והאגף הימני של הצבא הרומי נשענו על נהר אופידוס, ששימש להם כעוגן. לפי מספר מחקרים מודרניים, האגף הרומאי השמאלי נשען על שרשרת גבעות, אשר עוברת במרחק קצר מדרום לנהר. הם מניחים, שהפיקוד הרומי בחר לערוך את הקרב בגדה הדרומית של הנהר, בשטח המישורי הצר בין הנהר לקו הגבעות, כדי למנוע מכוח הפרשים העדיף בכמות ובאיכות של חניבעל מרחב תימרון, ולא לאפשר להם לאגף את הצבא הרומאי. בסך הכל, למעלה מ-70 אלף רגלים ופרשים רומיים ואיטלקיים (כעשרת אלפים חיילים נוספים נותרו במחנה הרומאי הראשי מצפון לנהר אופידיוס, ולא מילאו תפקיד פעיל במהלך הקרב) נדחסו לחזית צרה, שרוחבה לא עלה על כ-3000 מטר, עובדה שהגבילה במידה רבה על יכולת התמרון של הלגיונות הרומיים, ולא איפשרה להם להתפרס כהלכה.
היערכות הצבאות.
סופה של שנת 217 לפנה"ס ותחילתה של 216 לפנה"ס התאפיינו בתקריות קלות ובקרבות לא משמעותיים. חניבעל העביר את החורף בגרוניום שבאפוליה, ויצא ממנה בתחילת יוני כדי לצבור אספקה מכפרי הסביבה.
ברומא סיימו הדיקטטורים את כהונתם, וצבאותיהם עברו לידי הקונסולים של אותה שנה – אטילוס רגולוס וסרווילוס גמיניוס. הקונסולים של השנה היוצאת קיבלו הוראה להימנע מקרב עם חניבעל, ולהמתין לכניסת הקונסולים החדשים לתפקידם. בתחילת האביב נערכו בחירות ברומא. פאביוס, הדיקטטור של השנה שעברה, ניסה את מזלו מול הבוחר אך כשל. גאיוס טרנטיוס וארו זכה באמון הבוחר, וסיבוב נוסף נערך על מנת לבחור את עמיתו.