OpenCV With Python Part 1
Bài đăng này đã không được cập nhật trong 3 năm
I.OpenCV là gì?
1. Giới Thiệu
OpenCV là một thư viện mã nguồn mở hàng đầu cho thị giác máy tính (computer vision), xử lý ảnh và máy học, và các tính năng tăng tốc GPU trong hoạt động thời gian thực.
OpenCV được phát hành theo giấy phép BSD, do đó nó hoàn toàn miễn phí cho cả học thuật và thương mại. Nó có các interface C++, C, Python, Java và hỗ trợ Windows, Linux, Mac OS, iOS và Android. OpenCV được thiết kế để tính toán hiệu quả và với sự tập trung nhiều vào các ứng dụng thời gian thực. Được viết bằng tối ưu hóa C/C++, thư viện có thể tận dụng lợi thế của xử lý đa lõi. Được sử dụng trên khắp thế giới, OpenCV có cộng đồng hơn 47 nghìn người dùng và số lượng download vượt quá 6 triệu lần. Phạm vi sử dụng từ nghệ thuật tương tác, cho đến lĩnh vực khai thác mỏ, bản đồ trên web hoặc công nghệ robot.
2. Các ứng dụng OpenCV
OpenCV đang được sử dụng rộng rãi trong các ứng dụng bao gồm:
Hình ảnh street view Kiểm tra và giám sát tự động Robot và xe hơi tự lái Phân tích hình ảnh y tế Tìm kiếm và phục hồi hình ảnh/video Phim - cấu trúc 3D từ chuyển động Nghệ thuật sắp đặt tương tác
3.Chức năng OpenCV
Image/video I/O, xử lý, hiển thị (core, imgproc, highgui) Phát hiện các vật thể (objdetect, features2d, nonfree) Geometry-based monocular or stereo computer vision (calib3d, stitching, videostab) Computational photography (photo, video, superres) Machine learning & clustering (ml, flann) CUDA acceleration (gpu)
II. Thư viện và cài đặt.
1.Cài đặt python
Hầu như các hệ điều hành đều hỗ trợ Python, bạn có thể cài đặt online, hoặc offline. Chúng ta sẽ thấy các cách phổ biến sau:
Trên Debian (Ubuntu, Linux Mint, ...) chúng ta sử dụng
apt-get install python
Trên RedHat (CentOS, RedHat, Asianux, ...)
yum install python
Sau khi cài đặt xong, bạn cũng có thể sử dụng Python bằng cách gõ python vào cửa sổ dòng lệnh.
2. Cài đặt thư viện.
Chúng ta sẽ làm việc thông qua nhiều ví dụ Python ở đây. Bắt đầu với ràng buộc Python của OpenCV . Bạn sẽ cần hai thư viện chính, với một tùy chọn thứ ba: python-OpenCV, Numpy, và Matplotlib. Chúng ta bắt đầu cài đặt trên Linux nhé.
apt-get install python3-pip
sau đó chạy
pip3 install numpy or apt-get install python3-numpy
Tiếp theo chạy lệnh
pip3 install matplotlib or apt-get install python3-matplotlib
và cuối cùng là
apt-get install python-OpenCV
Có thể cài đặt theo cách này với Ubuntu 16.4 nhé
sudo apt-get install python-matplotlib
sudo apt-get install python-opencv
Matplotlib là một lựa chọn tùy chọn để hiển thị khung hình từ video hoặc hình ảnh. Chúng tôi sẽ cho thấy một vài ví dụ sử dụng nó ở đây. Numpy được sử dụng cho tất cả mọi thứ "số và Python." Chúng tôi chủ yếu sử dụng chức năng mảng của Numpy. Cuối cùng, chúng ta đang sử dụng các ràng buộc python cụ thể cho OpenCV gọi là python-OpenCV. Có một số hoạt động cho OpenCV mà bạn sẽ không thể làm mà không có cài đặt đầy đủ OpenCV (khoảng 3GB về kích thước), nhưng bạn thực sự có thể làm khá một chút với cài đặt khá tối thiểu của python-OpenCV. Chúng tôi sẽ giải quyết bằng cách sử dụng cài đặt đầy đủ của OpenCV trong loạt bài này, do đó bạn có thể cảm thấy tự do nếu muốn, nhưng 3 mô-đun này sẽ giúp chúng tôi bận rộn trong một thời gian! Đảm bảo cài đặt của bạn đã thành công bằng cách chạy Python và thực hiện:
III. Cơ sở , thuật toán và hướng dẩn tải một bức ảnh.
1. Các bước đầu tiên.
Create 1 file với đuôi py nhé. import các thư viện cần thiết vào đi nào .
import cv2
import matplotlib
import numpy
Nếu bạn không có lỗi nào, vậy chúng ta đã sẵn sàng để đi tiếp nhé. Trước tiên, chúng ta nên hiểu một vài giả định cơ bản và mô hình khi nói đến phân tích hình ảnh và video. Với cách thức chỉ là về mọi máy quay video ghi lại ngày hôm nay, bản ghi thực sự là khung hình, hiển thị từng cái một, khác 30-60 lần một lần. Ở cốt lõi, tuy nhiên, chúng là khung tĩnh, giống như hình ảnh. Do đó, nhận diện hình ảnh và phân tích video sử dụng các phương pháp giống nhau cho hầu hết các phần. Một số điều, như theo dõi hướng, sẽ yêu cầu một loạt các hình ảnh (khung hình), nhưng một cái gì đó như phát hiện khuôn mặt, hoặc nhận diện đối tượng có thể được thực hiện với gần như chính xác cùng mã trên hình ảnh và video. Tiếp theo, rất nhiều phân tích hình ảnh và video sôi sục xuống để đơn giản hóa nguồn càng nhiều càng tốt. Điều này gần như luôn luôn bắt đầu với việc chuyển đổi sang màu xám, nhưng nó cũng có thể là một bộ lọc màu, gradient, hoặc sự kết hợp của những điều này. Từ đây, chúng ta có thể thực hiện tất cả các loại phân tích và biến đổi nguồn. Nói chung, những gì xảy ra khi có sự chuyển đổi được thực hiện, sau đó phân tích, thì bất kỳ lớp phủ nào mà chúng tôi muốn áp dụng đều được áp dụng trở lại nguồn ban đầu, đó là lý do tại sao bạn thường thấy "sản phẩm hoàn chỉnh" có thể là đối tượng hoặc sự công nhận trên khuôn mặt Được hiển thị trên một hình ảnh đầy đủ màu sắc hoặc video. Hiếm khi dữ liệu thực sự được xử lý ở dạng thô như thế này, tuy nhiên. Một số ví dụ về những gì chúng ta có thể làm ở một mức cơ bản. Tất cả những điều này được thực hiện với một web cam cơ bản, không có gì đặc biệt:
2. Background Subtracting
Trong bối cảnh ứng dụng là một camera tĩnh (static camera) quan sát vùng (Field of View) không thay đổi, thao tác trích xuất chuyển động (motion detection) từ video là thủ tục nền rất quan trọng trong nhiều ứng dụng phân tích video hiện nay. Mục tiêu của xử lý này là làm sao tách bạch được đâu là vùng chuyển động (motion, foreground) đâu là nền (background) trong vùng không gian camera đang theo dõi. Trong nhiều kỉ thuật thì Background subtraction là một nhóm các giải pháp có thể giúp giải quyết vấn đề này đang được sử dụng phổ biến. Ý tưởng chính của Background subtraction là trước tiên đi xác định mô hình background (một hình, một tập tham số, hay một công thức có khả năng mô tả background) qua từng khung hình (frame) trong chuỗi các khung hình tuần tự của video, sau đó dựa vào giá trị pixel của khung hình hiện tại mà tính toán sự khác biệt để suy ra foreground. Quá trình này có thể đơn giản được mô tả bằng hình minh họa bên dưới.
3.Color filtering
Tiếp đến là phép lọc màu. Xem ví dụ nhé.
4.Edge detection
Sử dụng thuật toán để từ 1 bức ảnh .
để đưa ra kết quả
5.Đối sánh tính năng cho nhận dạng đối tượng
Ảnh minh họa.
Trong trường hợp phát hiện cạnh, màu đen tương ứng với các giá trị pixel của (0,0,0), và các đường trắng là (255,255,255). Mỗi ảnh và khung hình từ video chia nhỏ thành các điểm ảnh như thế này và chúng ta có thể suy luận, như trong trường hợp phát hiện cạnh, ở đó các cạnh được dựa trên nơi mà các điểm ảnh màu trắng được so sánh với màu đen. Sau đó, nếu muốn xem hình ảnh ban đầu với các cạnh được đánh dấu, chúng ta lưu ý tất cả các vị trí tọa độ của các điểm ảnh màu trắng, và sau đó chúng ta đánh dấu các vị trí này trên hình ảnh nguồn gốc nguồn cấp dữ liệu hoặc video. Đến cuối hướng dẫn này, bạn sẽ có thể thực hiện tất cả những điều trên, và có thể đào tạo máy tính của bạn để nhận ra bất kỳ đối tượng bạn muốn. Giống như tôi đã nói ban đầu mặc dù, bước đầu tiên thường là để chuyển đổi sang quy mô xám. Trước đó, chúng ta cần tải hình ảnh. Vì vậy, chúng ta hãy làm nó! Trong toàn bộ hướng dẫn này, tôi rất khuyến khích bạn sử dụng dữ liệu của riêng bạn để chơi với. Nếu bạn có một webcam, chắc chắn sử dụng nó, nếu không tìm thấy một hình ảnh mà bạn nghĩ sẽ được vui vẻ để làm việc với. Nếu bạn gặp rắc rối, đây là hình ảnh của đồng hồ:
Tiếp tục phần code. Thêm đoạn code sau nhé:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('watch.jpg',cv2.IMREAD_GRAYSCALE)
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Trước tiên, chúng tôi đang nhập một vài thứ, ba mô-đun tôi đã có tất cả các bạn cài đặt. Tiếp theo, chúng ta định nghĩa img là cv2.read (tệp hình ảnh, parms). Mặc định sẽ là IMREAD_COLOR, màu không có kênh alpha. Nếu bạn không quen thuộc, alpha là mức độ của sự đục (đối diện với độ trong suốt). Nếu bạn cần giữ lại kênh alpha, bạn cũng có thể sử dụng IMREAD_UNCHANGED. Nhiều lần, bạn sẽ được đọc trong phiên bản màu, và sau đó chuyển nó sang màu xám. Nếu bạn không có webcam, đây sẽ là phương pháp chính bạn sẽ sử dụng trong suốt hướng dẫn này, tải một hình ảnh. Thay vì sử dụng IMREAD_COLOR ..., bạn cũng có thể sử dụng các con số đơn giản. Bạn nên làm quen với cả hai lựa chọn, vì vậy bạn hiểu người đó đang làm gì. Đối với các tham số thứ hai, bạn có thể sử dụng -1, 0, hoặc 1. Màu là 1, grayscale là 0, và không thay đổi là -1. Vì vậy, đối với màu xám, người ta có thể làm img = cv2.imread ('watch.jpg', 0) Sau khi tải, chúng tôi sử dụng cv2.imshow (title, image) để hiển thị hình ảnh. Từ đây, chúng ta sử dụng cv2.waitKey (0) để chờ cho đến khi bất kỳ phím nào được nhấn. Sau khi đã hoàn tất, chúng tôi sử dụng cv2.destroyAllWindows () để đóng tất cả. Như đã đề cập trước đây, bạn cũng có thể hiển thị hình ảnh bằng Matplotlib, đây là một số mã cho cách bạn có thể làm điều đó:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('watch.jpg',cv2.IMREAD_GRAYSCALE)
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis
plt.plot([200,300,400],[100,200,300],'c', linewidth=5)
plt.show()
Lưu ý rằng bạn có thể vẽ các đường thẳng, giống như bạn có thể hoặc có thể với bất kỳ đồ thị Matplotlib nào khác sử dụng vị trí pixel là tọa độ, tại đây. Nếu bạn muốn vẽ trên hình ảnh của bạn, tuy nhiên, Matplotlib là không cần thiết. OpenCV cung cấp các phương pháp tuyệt vời cho việc này. Khi bạn đã hoàn tất việc sửa đổi, bạn có thể lưu lại, như sau:
cv2.imwrite('watchgray.png',img)
Bắt hình ảnh vào OpenCV có vẻ như đủ dễ dàng, làm thế nào về tải các nguồn cấp dữ liệu video? Trong hướng dẫn tiếp theo, chúng tôi sẽ chỉ cho bạn cách tải video trên webcam hoặc video.
IV. Tài liệu tham khảo.
Những bài viết trong seri mình tìm hiểu và dịch ở những tài liệu này. Nên các bạn có thể tham khảo chính xác hơn ở link đính kèm bên dưới. Cảm ơn các bạn nhiều .
All rights reserved