זירת חצי האי האפניני במלחמה הפונית השנייה
מהלך המלחמה > קרב קאנאי ותוצאותיו

עם הגיע האביב של שנת 216 לפנה"ס, התפטרו פאביוס ומינוקיוס ממשרותיהם, וכקונסולים של אותה שנה נבחרו לוקיוס אמיליוס פאולוס וגאיוס טרנטיוס וארו. סרוויליוס ומרקוס רגולוס התמנו לפרו קונסולים, וההוראה שקיבלו הייתה להתגרות בצבאו של חניבעל אך לא לתקוף אותו ישירות. חניבעל מצידו עזב את גרוניום וכבש את מצודת קאנאי, ששכנה במיקום אסטרטגי והוא מצא בה גם אספקה בשפע. הסנאט הרומי החליט לנטוש את אסטרטגיית ההתשה של פאביוס ולחתור לקרב הכרעה נגד צבאו במטרה להשמיד אותו לחלוטין. לפי התיאור של ליוויוס ופולביוס, מבין שני הקונסולים הרומיים, וארו היה הלהוט לכך ביותר. רומא גייסה צבא אדיר. לפי פוליביוס, הצבא הרומאי כלל 8 לגיונות ועוד 8 לגיונות של בעלי הברית, סה"כ 80,000 רגלים ו-6,000 פרשים, בעוד שלפי ליוויוס, הוא כלל 4 לגיונות ועוד 4 של בעלי הברית, שתוגברו מעט וכללו 49,000 רגלים ו-6,000 פרשים. מרבית החוקרים מאמצים את הערכתו של פוליביוס ביחס לגודלו של הצבא הרומאי. צבאו של חניבעל כלל ערב הקרב בערך 40,000 רגלים ו-10,000 פרשים, לאחר שגודלו תפח הודות לגאלים מצפון איטליה, שהצטרפו אליו לאחר הניצחון בקרב טראסימנוס.
הקרב נערך ככל הנראה באזור הנהר אופידוס (בשמו המודרני אופנטו) ב-2 באוגוסט 216 לפנה"ס. פוליביוס וליוויוס טוענים שווארו חסר הניסיון הצבאי פיקד באותו יום על הצבא, אולם ככל הנראה ההוראה לצאת לקרב הגיעה בלאו הכי מהסנאט, כך שלדבר אין חשיבות רבה. הקרב נפתח בהסתערות הפרשים של חניבעל, בפיקוד עזרובעל ומהרבעל, שהוצבו בשני האגפים של צבאו, על כנפות הפרשים של הצבא הרומאי. במקביל, החלו הלגיונות הרומיים במרכז, לתקוף את חיל הרגלים הקרתגי, שנערך בצורת חצי סהר שקדקודו פונה כלפי הצבא הרומאי. היתרון המספרי של הרומאים ואיכות כלי נשקם גרמו לכך, שהרגלים קלי החימוש של חניבעל שניצבו מולם, נדחקו בהדרגה לאחור עד שכיוון חצי הסהר התהפך, והמערך הקרתגי במרכז היה קרוב לשבירה. בשלב זה פתחו הרגלים הכבדים של חניבעל, שכללו בעיקר חיילים לוביים חמושים היטב, והוצבו באגפים של הרגלים הקלים במרכז, בהסתערות על האגפים של הלגיונות הרומיים, שנחשפו עקב התקדמותם לעומק המערך הקרתגי. ההסתערות הבלתי צפויה, שנפתחה בהטלת מטח של רמחים, גרמה לבלבול ולכאוס בשורות הלגיונות הרומיים. בשלב זה הצטרפו למתקפה גם פרשיו של חניבעל, שחזרו לשדה הקרב לאחר שסיימו להביס את כנפות הפרשים הרומיים, תקפו את חיל הרגלים הרומי מעורפו והשלימו את כיתור הצבא הרומאי. מה שהתרחש בהמשך דמה יותר לטבח מאשר לקרב. החיילים הרומיים, שנדחקו לתוך שטח צר והותקפו מכל העברים, לא יכלו לתמרן בגלל הצפיפות הרבה, ונטבחו ללא רחם.
הניצחון הקרתגי היה שלם. בין 50 אלף ל-70 אלף רומאים נהרגו בקרב, ביניהם כמה מאויביו המושבעים של חניבעל: מינוקיוס, הדיקטטור לשעבר, פאולוס, הקונסול השני של אותה שנה, וכן 80 סנטורים ו-29 טריבונים צבאיים. הניצחון המכריע של חניבעל בקרב, על אף הנחיתות המספרית הניכרת של צבאו, והטקטיקה המבריקה בה השתמש במהלך הקרב, היקנו לו מקום של כבוד בקרב המצביאים הגדולים בהיסטוריה.
לאחר הקרב, חלק מהמצביאים הקרתגים ובראשם מהרבעל, יעצו לחניבעל ללכוד את רומא חסרת המגן בהתקפה מהירה, תוך ניצול מהירות התנועה של פרשיו. אולם בצעד שנותר שנוי במחלוקת עד ימינו, חניבעל סרב. לא ברור מדוע סירב חניבעל לתקוף את רומא לאחר שעיקר צבאה הושמד בשדה הקרב והעיר נותרה חסרת הגנה כמעט. ייתכן שהסיבה נעוצב בכך שצבאו ספג אף הוא אבדות כבדות במהלך קרב קאנאי (כ-8,000 הרוגים ומספר לא ידוע של פצועים) ונזקק לזמן להתאוששות. החוקר ג'ון שין (John Shean) מעריך שמחסור בציוד מצור ובאספקה אילץ את חניבעל לעשות זאת, בעוד הנס דלבריק טוען שמחסור בכוח אדם והצורך של חניבעל להותיר חילות מצב בנקודות שונות, הם אלו שמנעו זאת ממנו. לדעת אדריאן גולדסוורת'י, העובדה שחניבעל סירב לתקוף את רומא מעידה שהוא לא תכנן להרוס את העיר, אלא רק לאלץ אותה לחתום על הסכם שלום נוח לקרתגו. עם זאת, מבקריו של חניבעל טוענים, שהיה לו סיכוי לכבוש את רומא בהתקפה מהירה, תוך ניצול הפאניקה שהתבוסה עוררה בקרב הציבור ברומא, והעובדה ששדרת הפיקוד הרומאית השתבשה לחלוטין עקב אובדן רוב הפיקוד הבכיר של הצבא בשדה הקרב.