This might be a silly question, but is the Opportunity closed? If an Opportunity has been closed as won or lost, it becomes read-only regardless of security roles assigned.
Otherwise, I recommend checking the security roles in more detail. Open the security roles that are assigned to your users, and search for the "Opportunity" table. Take note of what the "Edit" permission is set to:
None: The user cannot edit Opportunities at all
User: They user can only edit Opportunities where they are the owner
Business Unit: The user can edit Opportunities owned by themselves, or where the owner is in the same BU
Parent/Child Business Unit: They can edit Opportunities owned by themselves, or owned by a user in the same or a child BU
Organization: The user can edit any Opportunity across the system regardless or owner or BU
You can also open an Opportunity record, and at the top click on the "Check Access" button. Then enter in the users who you are checking. This should show what permissions they have been given, and which roles/team memberships are granting them. This is a great way to do a check outside of diving into the security roles and user settings themselves.