Trong hướng dẫn này, bạn sẽ học cách xoay hình ảnh bằng OpenCV. Ngoài ra, tôi cũng sẽ chỉ cho bạn cách xoay ảnh bằng hai chức năng tiện lợi của tôi từ thư viện imutils,
$ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files3 và
$ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files4, giúp xoay ảnh bằng OpenCV dễ dàng hơn [và yêu cầu ít mã hơn]
Trước đây, chúng ta đã học cách dịch [i. e. , shift] một hình ảnh, lên, xuống, trái và phải [hoặc bất kỳ sự kết hợp nào]. Chúng tôi hiện đang chuyển sang chủ đề xử lý hình ảnh tiếp theo của chúng tôi - xoay
Xoay chính xác như âm thanh của nó. xoay hình ảnh theo một số góc,
Tôi cũng sẽ chỉ cho bạn một số kỹ thuật giúp xoay hình ảnh bằng OpenCV dễ dàng hơn
Để tìm hiểu cách xoay hình ảnh bằng OpenCV, chỉ cần tiếp tục đọc
Tìm kiếm mã nguồn cho bài viết này?
OpenCV Xoay hình ảnh
Trong phần đầu tiên của hướng dẫn này, chúng ta sẽ thảo luận về cách OpenCV xoay hình ảnh và các chức năng có sẵn để xoay
Từ đó, chúng tôi sẽ định cấu hình môi trường phát triển của mình và xem xét cấu trúc thư mục dự án của chúng tôi
Sau đó, tôi sẽ chỉ cho bạn ba cách để xoay hình ảnh bằng OpenCV
- Sử dụng hàm
$ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files
0. Được xây dựng trong OpenCV, nhưng yêu cầu xây dựng một ma trận xoay và áp dụng rõ ràng một đường cong affine, làm cho mã dài dòng hơn - Sử dụng hàm
$ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files
3. Một phần của thư viện imutils của tôi. Cho phép xoay hình ảnh bằng OpenCV trong một lần gọi hàm - Sử dụng hàm
$ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files
4. Cũng là một phần của thư viện imutils của tôi. Đảm bảo rằng không có phần nào của hình ảnh bị cắt trong quá trình xoay
Chúng tôi sẽ kết thúc hướng dẫn này bằng cách xem xét kết quả xoay vòng OpenCV của chúng tôi
OpenCV xoay hình ảnh như thế nào?
Tương tự như phép tịnh tiến, và có lẽ không có gì đáng ngạc nhiên, phép quay theo một góc
Cho một mặt phẳng [x, y]-Cartesian, ma trận này có thể được sử dụng để xoay một vectơ
Từ ảnh gốc, I, ảnh được xoay, R, sau đó thu được bằng phép nhân ma trận đơn giản.
Tuy nhiên, OpenCV cũng cung cấp khả năng [1] chia tỷ lệ [i. e. , thay đổi kích thước] một hình ảnh và [2] cung cấp một tâm xoay tùy ý xung quanh để thực hiện xoay
Do đó, ma trận xoay đã sửa đổi của chúng tôi, M, là
trong đó
Nếu toán học bắt đầu trở nên hơi choáng ngợp, đừng lo lắng - chúng ta sẽ chuyển sang một số mã giúp các khái niệm này rõ ràng hơn nhiều
Định cấu hình môi trường phát triển của bạn
Để làm theo hướng dẫn này, bạn cần cài đặt thư viện OpenCV trên hệ thống của mình
May mắn thay, OpenCV có thể cài đặt bằng pip
$ pip install opencv-contrib-python
Nếu bạn cần trợ giúp để định cấu hình môi trường phát triển của mình cho OpenCV, tôi thực sự khuyên bạn nên đọc hướng dẫn cài đặt OpenCV theo pip của tôi — nó sẽ giúp bạn thiết lập và chạy trong vài phút
Bạn gặp sự cố khi định cấu hình môi trường phát triển của mình?
Tất cả những gì đã nói, là bạn
- Thời gian ngắn?
- Tìm hiểu trên hệ thống bị khóa quản trị của chủ nhân của bạn?
- Bạn muốn bỏ qua những rắc rối khi chiến đấu với dòng lệnh, trình quản lý gói và môi trường ảo?
- Bạn đã sẵn sàng chạy mã ngay bây giờ trên các hệ thống Windows, macOS hoặc Linux của mình chưa?
Vậy thì hãy tham gia PyImageSearch Plus ngay hôm nay
Có quyền truy cập vào Jupyter Notebooks cho hướng dẫn này và các hướng dẫn khác của PyImageSearch được định cấu hình sẵn để chạy trên hệ sinh thái của Google Colab ngay trong trình duyệt web của bạn. Không cần cài đặt
Và trên hết, những Notebook Jupyter này sẽ chạy trên Windows, macOS và Linux
Cấu trúc dự án
Trước khi chúng tôi có thể triển khai xoay vòng với OpenCV, trước tiên hãy xem lại cấu trúc thư mục dự án của chúng tôi
Đảm bảo rằng bạn truy cập phần “Tải xuống” của hướng dẫn này để truy xuất mã nguồn và hình ảnh ví dụ, rồi từ đó, hãy xem qua bên trong
$ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files
Ở đây, chúng ta có
$ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files3. Tập lệnh này sẽ tải
$ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files4 [hoặc bất kỳ hình ảnh nào khác mà bạn chọn] và sau đó áp dụng một loạt phép xoay cho nó, qua đó trình bày cách thực hiện phép xoay với OpenCV
Thực hiện xoay hình ảnh với OpenCV
Bây giờ chúng tôi đã sẵn sàng để triển khai xoay hình ảnh với OpenCV
Mở tệp
$ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files3 trong cấu trúc thư mục dự án của bạn và chèn đoạn mã sau
# import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser[] ap.add_argument["-i", "--image", type=str, default="opencv_logo.png", help="path to the input image"] args = vars[ap.parse_args[]]
Dòng 2-4 nhập các gói Python cần thiết của chúng tôi. Chúng tôi sẽ sử dụng
$ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files6 cho các đối số dòng lệnh, imutils cho tập hợp các hàm tiện ích OpenCV của tôi [cụ thể là các phương thức
$ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files3 và
$ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files4] và
$ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files9 cho các ràng buộc OpenCV của chúng tôi
Chúng tôi chỉ có một đối số dòng lệnh duy nhất,
# import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser[] ap.add_argument["-i", "--image", type=str, default="opencv_logo.png", help="path to the input image"] args = vars[ap.parse_args[]]0, là đường dẫn đến hình ảnh đầu vào mà chúng tôi muốn xoay [mà chúng tôi mặc định là
$ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files4]
Tiếp theo, hãy tải hình ảnh đầu vào của chúng tôi từ đĩa và thực hiện một số thay đổi kích thước cơ bản
$ pip install opencv-contrib-python1
Chúng tôi bắt đầu bằng cách tải hình ảnh đầu vào của chúng tôi và hiển thị nó trên màn hình của chúng tôi
Khi chúng tôi xoay một hình ảnh, chúng tôi cần chỉ định xung quanh điểm mà chúng tôi muốn xoay. Trong hầu hết các trường hợp, bạn sẽ muốn xoay quanh tâm của hình ảnh;
Hãy tiếp tục và xoay quanh tâm của hình ảnh. Dòng 18 và 19 lấy chiều rộng và chiều cao của hình ảnh rồi chia từng thành phần cho
# import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser[] ap.add_argument["-i", "--image", type=str, default="opencv_logo.png", help="path to the input image"] args = vars[ap.parse_args[]]2 để xác định tâm của hình ảnh
Giống như chúng ta xác định một ma trận để dịch một hình ảnh, chúng ta cũng xác định một ma trận để xoay hình ảnh. Thay vì xây dựng ma trận theo cách thủ công bằng cách sử dụng NumPy [có thể hơi tẻ nhạt], chúng ta sẽ chỉ gọi phương thức
# import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser[] ap.add_argument["-i", "--image", type=str, default="opencv_logo.png", help="path to the input image"] args = vars[ap.parse_args[]]3 trên Dòng 22
Hàm
# import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser[] ap.add_argument["-i", "--image", type=str, default="opencv_logo.png", help="path to the input image"] args = vars[ap.parse_args[]]3 nhận ba đối số. Đối số đầu tiên là điểm mà chúng ta xoay hình ảnh [trong trường hợp này là tâm
# import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser[] ap.add_argument["-i", "--image", type=str, default="opencv_logo.png", help="path to the input image"] args = vars[ap.parse_args[]]5 và
# import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser[] ap.add_argument["-i", "--image", type=str, default="opencv_logo.png", help="path to the input image"] args = vars[ap.parse_args[]]6 của hình ảnh]
Sau đó, chúng tôi chỉ định
Đối số cuối cùng là tỷ lệ của hình ảnh. Chúng tôi chưa thảo luận về việc thay đổi kích thước hình ảnh, nhưng ở đây bạn có thể chỉ định một giá trị dấu phẩy động, trong đó 1. 0 có nghĩa là giống nhau, kích thước ban đầu của hình ảnh được sử dụng. Tuy nhiên, nếu bạn chỉ định giá trị là 2. 0, hình ảnh tăng gấp đôi kích thước — tương tự, giá trị 0. 5 nửa kích thước hình ảnh
Khi chúng ta có ma trận xoay
# import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser[] ap.add_argument["-i", "--image", type=str, default="opencv_logo.png", help="path to the input image"] args = vars[ap.parse_args[]]7 từ hàm
# import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser[] ap.add_argument["-i", "--image", type=str, default="opencv_logo.png", help="path to the input image"] args = vars[ap.parse_args[]]3, chúng ta có thể áp dụng phép xoay cho hình ảnh của mình bằng phương pháp
# import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser[] ap.add_argument["-i", "--image", type=str, default="opencv_logo.png", help="path to the input image"] args = vars[ap.parse_args[]]9 trên Dòng 23
Đối số đầu tiên của hàm này là
$ pip install opencv-contrib-python10 mà chúng ta muốn xoay. Sau đó, chúng tôi chỉ định ma trận xoay
# import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser[] ap.add_argument["-i", "--image", type=str, default="opencv_logo.png", help="path to the input image"] args = vars[ap.parse_args[]]7 và kích thước đầu ra [chiều rộng và chiều cao] của hình ảnh của chúng tôi. Dòng 24 sau đó hiển thị hình ảnh của chúng tôi được xoay 45 độ
Các dòng 27-29 làm tương tự, nhưng lần này xoay một hình ảnh _______112 độ [theo chiều kim đồng hồ] quanh tọa độ _______65 và _______66 ở tâm
Ghi chú. Hãy nhớ rằng trong OpenCV, độ dương xác định xoay ngược chiều kim đồng hồ trong khi độ âm biểu thị xoay theo chiều kim đồng hồ. Giữ nó trong tâm trí;
Hình 4 hiển thị đầu ra của các thao tác thay đổi kích thước này
Như bạn có thể thấy, hình ảnh của chúng tôi đã được xoay. Hãy dành một chút thời gian để lưu ý rằng OpenCV không tự động phân bổ không gian cho toàn bộ hình ảnh được xoay của chúng tôi để vừa với khung
Đây là hành vi dự định. Nếu bạn muốn toàn bộ hình ảnh vừa với chế độ xem sau khi xoay, bạn cần sửa đổi chiều rộng và chiều cao, được ký hiệu là
$ pip install opencv-contrib-python15 trong hàm
# import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser[] ap.add_argument["-i", "--image", type=str, default="opencv_logo.png", help="path to the input image"] args = vars[ap.parse_args[]]9. Như chúng ta sẽ thấy ở phần sau trong tập lệnh này, hàm
$ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files4 sẽ đảm nhận tất cả những việc đó cho chúng ta
Cho đến thời điểm này, chúng tôi chỉ xoay một hình ảnh về trung tâm của hình ảnh. Nhưng nếu chúng ta muốn xoay hình ảnh về một số điểm tùy ý thì sao?
Hãy tiếp tục và xem làm thế nào điều này có thể được thực hiện
$ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files7
Đến bây giờ, mã này trông khá chuẩn để thực hiện phép quay. Tuy nhiên, hãy lưu ý đối số đầu tiên của hàm
# import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser[] ap.add_argument["-i", "--image", type=str, default="opencv_logo.png", help="path to the input image"] args = vars[ap.parse_args[]]3. Ở đây, chúng tôi chỉ ra rằng chúng tôi muốn xoay hình ảnh xung quanh x = 10, y = 10 hoặc xấp xỉ góc trên cùng bên trái của hình ảnh
Khi chúng tôi áp dụng cách xoay này, hình ảnh đầu ra của chúng tôi trông như thế này
Ta có thể thấy tâm xoay không còn là tâm của ảnh
Tuy nhiên, cũng giống như việc dịch một hình ảnh, thực hiện lệnh gọi tới cả
# import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser[] ap.add_argument["-i", "--image", type=str, default="opencv_logo.png", help="path to the input image"] args = vars[ap.parse_args[]]3 và
# import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser[] ap.add_argument["-i", "--image", type=str, default="opencv_logo.png", help="path to the input image"] args = vars[ap.parse_args[]]9 có thể trở nên khá tẻ nhạt — chưa kể nó còn làm cho mã của chúng ta trở nên dài dòng hơn đáng kể
Hãy giảm số lượng mã chúng ta cần viết bằng cách gọi
$ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files3, một chức năng tiện lợi kết thúc các cuộc gọi đến
# import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser[] ap.add_argument["-i", "--image", type=str, default="opencv_logo.png", help="path to the input image"] args = vars[ap.parse_args[]]3 và
# import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser[] ap.add_argument["-i", "--image", type=str, default="opencv_logo.png", help="path to the input image"] args = vars[ap.parse_args[]]9
$ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files3
Ở đây, chúng tôi xoay hình ảnh của mình 180 độ, nhưng chúng tôi có thể làm cho mã của mình ít dài dòng hơn đáng kể bằng cách sử dụng phương thức
$ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files74
Hình 6 hiển thị đầu ra của vòng quay của chúng tôi
Như bạn đã thấy trong các ví dụ trước, OpenCV không phân bổ đủ dung lượng để lưu trữ toàn bộ hình ảnh nếu một phần của hình ảnh bị cắt trong quá trình xoay
Cách giải quyết vấn đề đó là sử dụng hàm
$ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files4
$ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files5
Chức năng này sẽ tự động mở rộng mảng hình ảnh sao cho toàn bộ hình ảnh được xoay nằm gọn trong nó
Kết quả của việc áp dụng hàm
$ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files76 có thể được nhìn thấy trong Hình 7, trong đó chúng ta xoay hình ảnh 33 độ ngược chiều kim đồng hồ
Và đó là tất cả để có nó
Ghi chú. Hàm
$ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files4 đảo ngược mối quan hệ giữa các giá trị dương/âm và xoay theo chiều kim đồng hồ/ngược chiều kim đồng hồ. Ở đây, các giá trị âm sẽ xoay ngược chiều kim đồng hồ trong khi các giá trị dương sẽ xoay theo chiều kim đồng hồ
Khi áp dụng xoay ảnh với OpenCV, bạn có ba tùy chọn
# import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser[] ap.add_argument["-i", "--image", type=str, default="opencv_logo.png", help="path to the input image"] args = vars[ap.parse_args[]]
3 và# import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser[] ap.add_argument["-i", "--image", type=str, default="opencv_logo.png", help="path to the input image"] args = vars[ap.parse_args[]]
9$ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files
3$ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files
4
Trộn và kết hợp chúng khi bạn thấy phù hợp với các ứng dụng của riêng bạn
Kết quả xoay hình ảnh OpenCV
Để xoay hình ảnh bằng OpenCV, hãy nhớ truy cập phần “Tải xuống” của hướng dẫn này để lấy mã nguồn và hình ảnh ví dụ
Chúng tôi đã xem xét kết quả của tập lệnh này trong phần trước, nhưng khi bạn đã sẵn sàng chạy tập lệnh cho chính mình, bạn có thể sử dụng lệnh sau
$ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files9
Kết quả xoay vòng OpenCV của bạn phải khớp với kết quả của tôi từ phần trước
Cái gì tiếp theo?
Thông tin khóa học.
Tổng cộng hơn 60 lớp • Hơn 64 giờ video hướng dẫn mã theo yêu cầu • Cập nhật lần cuối. Tháng 12 năm 2022
★★★★★ 4. 84 [128 Xếp hạng] • Hơn 15.800 Học sinh Ghi danh
Tôi thực sự tin rằng nếu bạn có đúng giáo viên, bạn có thể thành thạo thị giác máy tính và học sâu
Bạn có nghĩ rằng việc học thị giác máy tính và học sâu tốn nhiều thời gian, quá sức và phức tạp không?
Đó không phải là trường hợp
Tất cả những gì bạn cần để thành thạo thị giác máy tính và học sâu là nhờ ai đó giải thích mọi thứ cho bạn bằng các thuật ngữ đơn giản, trực quan. Và đó chính xác là những gì tôi làm. Nhiệm vụ của tôi là thay đổi giáo dục và cách dạy các chủ đề Trí tuệ nhân tạo phức tạp
Nếu bạn nghiêm túc về việc học thị giác máy tính, điểm dừng chân tiếp theo của bạn phải là Đại học PyImageSearch, khóa học trực tuyến về thị giác máy tính, học sâu và OpenCV toàn diện nhất hiện nay. Tại đây, bạn sẽ học cách áp dụng thành công và tự tin tầm nhìn máy tính vào công việc, nghiên cứu và dự án của mình. Tham gia cùng tôi trong việc làm chủ thị giác máy tính
Bên trong Đại học PyImageSearch, bạn sẽ tìm thấy
- ✓ Hơn 60 khóa học về chủ đề thị giác máy tính thiết yếu, học sâu và OpenCV
- ✓ Hơn 60 Chứng chỉ Hoàn thành
- ✓ Hơn 64 giờ video theo yêu cầu
- ✓ Các khóa học hoàn toàn mới được phát hành thường xuyên, đảm bảo bạn có thể theo kịp các kỹ thuật tiên tiến nhất
- ✓ Máy tính xách tay Jupyter được định cấu hình sẵn trong Google Colab
- ✓ Chạy tất cả các mẫu mã trong trình duyệt web của bạn — hoạt động trên Windows, macOS và Linux [không yêu cầu cấu hình môi trường nhà phát triển. ]
- ✓ Truy cập kho lưu trữ mã tập trung cho tất cả hơn 500 hướng dẫn trên PyImageSearch
- ✓ Dễ dàng tải xuống bằng một cú nhấp chuột đối với mã, bộ dữ liệu, mô hình được đào tạo trước, v.v.
- ✓ Truy cập trên thiết bị di động, máy tính xách tay, máy tính để bàn, v.v.
Nhấn vào đây để tham gia Đại học PyImageSearch
Tóm lược
Trong hướng dẫn này, bạn đã học cách xoay hình ảnh bằng OpenCV. Để xoay hình ảnh theo một góc tùy ý với OpenCV, chúng ta cần
- Xây dựng ma trận xoay 2D bằng hàm
# import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser[] ap.add_argument["-i", "--image", type=str, default="opencv_logo.png", help="path to the input image"] args = vars[ap.parse_args[]]
3 - Thực hiện một sợi dọc affine bằng cách sử dụng chức năng
# import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser[] ap.add_argument["-i", "--image", type=str, default="opencv_logo.png", help="path to the input image"] args = vars[ap.parse_args[]]
9, cung cấp hình ảnh đầu vào của chúng tôi và ma trận xoay được tính toán,# import the necessary packages import argparse import imutils import cv2 # construct the argument parser and parse the arguments ap = argparse.ArgumentParser[] ap.add_argument["-i", "--image", type=str, default="opencv_logo.png", help="path to the input image"] args = vars[ap.parse_args[]]
7
Kết quả là hình ảnh đã được xoay
Vấn đề với việc sử dụng các hàm của OpenCV để xoay hình ảnh là chúng yêu cầu hai dòng mã — một dòng để xây dựng ma trận xoay và sau đó là dòng khác để thực hiện chuyển đổi
Để giúp xoay hình ảnh với OpenCV dễ dàng hơn, tôi đã triển khai hai phương thức trong thư viện imutils của mình
$ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files
3. Thực hiện xoay hình ảnh OpenCV trong một dòng mã$ tree . --dirsfirst . ├── opencv_logo.png └── opencv_rotate.py 0 directories, 2 files
4. Cũng thực hiện xoay ảnh với OpenCV nhưng đảm bảo ảnh [sau khi xoay] vẫn xem được và không có phần nào của ảnh bị cắt
Tôi khuyên bạn nên làm quen với cả ba kỹ thuật xoay vì bạn có thể sẽ sử dụng từng kỹ thuật khi phát triển quy trình xử lý hình ảnh tương ứng của riêng mình
Để tải mã nguồn về bài đăng này [và được thông báo khi các hướng dẫn trong tương lai được xuất bản tại đây trên PyImageSearch], chỉ cần nhập địa chỉ email của bạn vào biểu mẫu bên dưới
Tải xuống Mã nguồn và Hướng dẫn tài nguyên 17 trang MIỄN PHÍ
Nhập địa chỉ email của bạn dưới đây để có được một. zip của mã và Hướng dẫn tài nguyên 17 trang MIỄN PHÍ về Thị giác máy tính, OpenCV và Học sâu. Bên trong, bạn sẽ tìm thấy các hướng dẫn, sách, khóa học và thư viện được chọn lọc thủ công của tôi để giúp bạn thành thạo CV và DL