Pretty cool game, I really like the multiple camera views (first person for cannon, third person for walking on boat, top down for navigation) it adds some good variety to the gameplay. I think making the enemy ships rotate smoothly and adding a sinking animation for when they get hit would be some cool next things to add. In terms of the graphics, you could improve the water waves by layering in more sin waves at different frequencies and directions and then maybe using some noise you could vary the wave texture so it doesn't look like it's repeating as much.
I took a quick look at your code, I think some general cleanup (removing old comments, cleaning up formatting) would help with the readability and adding some high level class comments would help someone new to the code more easily understand it. Overall you have some good variable and function names which help too. Also a recommendation I'd make is to move a lot of your logic out of the main() function, usually a good way to organize the game loop code is to clearly split it up into update logic (like handling input and updating physics) and rendering.
Overall great project!