Cv2 là gì

Trong bài viết Hướng dẫn sử dụng OpenCV Python này, chúng tôi sẽ đề cập đến các khía cạnh khác nhau của Thị giác máy tính bằng cách sử dụng OpenCV trong Python. OpenCV đã là một phần quan trọng trong quá trình phát triển phần mềm trong một thời gian dài. Học OpenCV là một tài sản tốt cho nhà phát triển để cải thiện các khía cạnh của mã hóa và cũng giúp xây dựng sự nghiệp phát triển phần mềm.

Chúng tôi sẽ kiểm tra các khái niệm sau:

  • Thị giác máy tính là gì?
  • Làm thế nào một máy tính đọc một hình ảnh?
  • OpenCV là gì?
  • Khái niệm cơ bản về OpenCV
  • Phát hiện hình ảnh bằng OpenCV
  • Máy dò chuyển động sử dụng OpenCV

Để đơn giản hóa câu trả lời cho điều này - Chúng ta hãy xem xét một kịch bản.

Tất cả chúng ta đều sử dụng Facebook, đúng không? Giả sử bạn và bạn bè của bạn đã đi nghỉ và bạn đã nhấp vào rất nhiều ảnh và bạn muốn tải chúng lên Facebook và bạn đã làm như vậy. Nhưng bây giờ, sẽ không mất quá nhiều thời gian chỉ để tìm khuôn mặt bạn bè và gắn thẻ họ vào mỗi bức ảnh? Facebook đủ thông minh để thực sự gắn thẻ mọi người cho bạn.

Vì vậy, bạn nghĩ tính năng tự động gắn thẻ hoạt động như thế nào? Nói một cách dễ hiểu, nó hoạt động trên thị giác máy tính.

Thị giác máy tính là một lĩnh vực liên ngành đề cập đến cách máy tính có thể được tạo ra để đạt được hiểu biết cấp cao từ hình ảnh hoặc video kỹ thuật số.

Ý tưởng ở đây là tự động hóa các nhiệm vụ mà hệ thống thị giác của con người có thể thực hiện. Vì vậy, một máy tính phải có thể nhận dạng các đối tượng như khuôn mặt của con người, cột đèn hoặc thậm chí là một bức tượng.

Làm thế nào để một máy tính đọc một hình ảnh?

Hãy xem xét hình ảnh dưới đây:

Chúng ta có thể nhận ra rằng đó là hình ảnh của Đường chân trời New York. Tuy nhiên, máy tính có thể tự tìm ra điều này không? Câu trả lời là không!

Máy tính đọc bất kỳ hình ảnh nào dưới dạng một dải giá trị từ 0 đến 255.

Đối với bất kỳ hình ảnh màu nào, có 3 kênh chính - Đỏ, xanh lá cây và xanh lam. Cách nó hoạt động khá đơn giản.

Một ma trận được hình thành cho mọi màu cơ bản và sau đó các ma trận này kết hợp với nhau để cung cấp giá trị Pixel cho các màu R, G, B riêng lẻ.

Mỗi phần tử của ma trận cung cấp dữ liệu liên quan đến cường độ sáng của pixel.

Hãy xem xét hình ảnh sau:

Như được hiển thị, kích thước của hình ảnh ở đây có thể được tính là B x A x 3.

Lưu ý: Đối với hình ảnh đen trắng, chỉ có một kênh duy nhất.

Tiếp theo trong bài viết này, chúng ta hãy xem OpenCV thực sự là gì.

OpenCV là gì?

OpenCV là một thư viện Python được thiết kế để giải quyết các vấn đề về thị giác máy tính. OpenCV ban đầu được phát triển vào năm 1999 bởi Intel nhưng sau đó nó được hỗ trợ bởi Willow Garage.

OpenCV hỗ trợ nhiều ngôn ngữ lập trình như C ++, Python, Java, v.v. Hỗ trợ nhiều nền tảng bao gồm Windows, Linux và MacOS.

OpenCV Python không là gì ngoài một lớp trình bao bọc cho thư viện C ++ gốc được sử dụng với Python. Sử dụng điều này, tất cả các cấu trúc mảng OpenCV được chuyển đổi thành / từ mảng NumPy.

Điều này giúp dễ dàng tích hợp nó với các thư viện khác sử dụng NumPy. Ví dụ, các thư viện như SciPy và Matplotlib.

Tiếp theo trong bài viết này, chúng ta hãy xem xét một số thao tác cơ bản mà chúng ta có thể thực hiện với OpenCV.

Các thao tác cơ bản với OpenCV?

Hãy để chúng tôi xem xét các khái niệm khác nhau, từ tải hình ảnh đến thay đổi kích thước chúng, v.v.

Tải hình ảnh bằng OpenCV:

Import cv2 # colored Image Img = cv2.imread (“Penguins.jpg”,1) # Black and White (gray scale) Img_1 = cv2.imread (“Penguins.jpg”,0))

Sau đó, chúng ta có thể đọc hình ảnh bằng cách sử dụng mô-đun imread . Giá trị 1 trong các tham số biểu thị rằng đó là hình ảnh màu. Nếu tham số là 0 thay vì 1, điều đó có nghĩa là hình ảnh được nhập là hình ảnh đen trắng. Tên của hình ảnh ở đây là 'Chim cánh cụt'. Khá đơn giản, phải không?

Hình dạng / Độ phân giải hình ảnh:

Chúng ta có thể sử dụng chức năng phụ shape để in ra hình dạng của hình ảnh. Tham khảo bên dưới.

Import cv2 # Black and White (gray scale) Img = cv2.imread (“Penguins.jpg”,0) Print(img.shape)

Hiển thị hình ảnh:

Hiển thị hình ảnh bằng OpenCV khá đơn giản và dễ hiểu. Tham khảo bên dưới.

import cv2 # Black and White (gray scale) Img = cv2.imread (“Penguins.jpg”,0) cv2.imshow(“Penguins”, img) cv2.waitKey(0) # cv2.waitKey(2000) cv2.destroyAllWindows()

Chúng tôi sử dụng chức năng imshow để hiển thị hình ảnh bằng cách mở một cửa sổ. Có 2 tham số của hàm imshow là tên cửa sổ và đối tượng hình ảnh sẽ hiển thị.

Sau đó, chúng tôi chờ một sự kiện của người dùng. waitKey làm cho cửa sổ tĩnh cho đến khi người dùng nhấn một phím. Tham số được truyền cho nó là thời gian tính bằng mili giây.

Và cuối cùng, chúng tôi sử dụng killAllWindows để đóng cửa sổ dựa trên tham số waitForKey.

Thay đổi kích thước hình ảnh:

Tương tự, thay đổi kích thước hình ảnh rất dễ dàng. Đây là một đoạn mã khác:

import cv2 # Black and White (gray scale) img = cv2.imread (“Penguins.jpg”,0) resized_image = cv2.resize(img, (650,500)) cv2.imshow(“Penguins”, resized_image) cv2.waitKey(0) cv2.destroyAllWindows()

Sau đó, hãy lưu ý rằng đối tượng hình ảnh thay đổi từ img thành resize_image, vì đối tượng hình ảnh thay đổi ngay bây giờ.

Phần còn lại của mã khá đơn giản so với phần trước, đúng không?

Tôi chắc rằng các bạn rất tò mò muốn nhìn ngắm những chú chim cánh cụt phải không? Đây là hình ảnh chúng tôi đang tìm kiếm để xuất ra trong suốt thời gian này!

Có một cách khác để truyền các tham số cho hàm thay đổi kích thước. Tham khảo bên dưới.

Resized_image = cv2.resize(img, int(img.shape[1]/2), int(img.shape[0]/2)))

Tiếp theo trong bài viết này, chúng ta hãy xem cách chúng tôi thực hiện nhận diện khuôn mặt bằng OpenCV.

Nhận diện khuôn mặt bằng OpenCV

Điều này thoạt nghe có vẻ phức tạp nhưng rất dễ dàng. Hãy để tôi hướng dẫn bạn toàn bộ quá trình và bạn cũng sẽ cảm thấy như vậy.

Bước 1: Xem xét các điều kiện tiên quyết của chúng tôi, chúng tôi sẽ yêu cầu một hình ảnh, để bắt đầu. Sau đó, chúng ta cần tạo một bộ phân loại thác, cuối cùng sẽ cung cấp cho chúng ta các đặc điểm của khuôn mặt.

Bước 2: Bước này liên quan đến việc sử dụng OpenCV để đọc hình ảnh và tệp tính năng. Vì vậy, tại thời điểm này, có các mảng NumPy tại các điểm dữ liệu chính.

Tất cả những gì chúng ta cần làm là tìm kiếm các giá trị hàng và cột của mặt NumPy ndarray. Đây là mảng có tọa độ hình chữ nhật mặt.

Bước 3: Bước cuối cùng này liên quan đến việc hiển thị hình ảnh với hộp mặt hình chữ nhật.

Hãy xem hình ảnh sau, ở đây tôi đã tóm tắt 3 bước dưới dạng hình ảnh để dễ đọc hơn:

Khá đơn giản, chính xác?

Đầu tiên, chúng ta tạo một đối tượng CascadeClassifier để trích xuất các đặc điểm của khuôn mặt như đã giải thích trước đó. Đường dẫn đến tệp XML chứa các đặc điểm khuôn mặt là tham số ở đây.

Bước tiếp theo sẽ là đọc hình ảnh có khuôn mặt trên đó và chuyển nó thành hình ảnh đen trắng bằng COLOR_BGR2GREY . Tiếp theo, chúng tôi tìm kiếm tọa độ cho hình ảnh. Điều này được thực hiện bằng cách sử dụng detectorMultiScale .

Bạn hỏi tọa độ nào? Đó là tọa độ cho hình chữ nhật mặt. Các scaleFactor được sử dụng để giảm giá trị hình bằng 5% cho đến khi khuôn mặt được tìm thấy. Vì vậy, về tổng thể - Giá trị càng nhỏ thì độ chính xác càng lớn.

Cuối cùng, khuôn mặt được in trên cửa sổ.

Thêm hộp mặt hình chữ nhật:

Logic này rất đơn giản - Đơn giản như việc sử dụng câu lệnh vòng lặp for. Kiểm tra hình ảnh sau đây.

Chúng tôi xác định phương pháp tạo hình chữ nhật bằng cách sử dụng cv2.rectangle bằng cách truyền các tham số như đối tượng hình ảnh, các giá trị RGB của đường viền hình hộp và chiều rộng của hình chữ nhật.

Hãy để chúng tôi kiểm tra toàn bộ mã để nhận diện khuôn mặt:

import cv2 # Create a CascadeClassifier Object face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml") # Reading the image as it is img = cv2.imread("photo.jpg") # Reading the image as gray scale image gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # Search the co-ordintes of the image faces = face_cascade.detectMultiScale(gray_img, scaleFactor = 1.05, minNeighbors=5) for x,y,w,h in faces: img = cv2.rectangle(img, (x,y), (x+w,y+h),(0,255,0),3) resized = cv2.resize(img, (int(img.shape[1]/7),int(img.shape[0]/7))) cv2.imshow("Gray", resized) cv2.waitKey(0) cv2.destroyAllWindows()

Quay video bằng OpenCV

Quay video bằng OpenCV cũng khá đơn giản. vòng lặp sau đây sẽ cung cấp cho bạn một ý tưởng tốt hơn. Kiểm tra nó ra:

Các hình ảnh được đọc từng cái một và do đó video được tạo ra do quá trình xử lý nhanh các khung hình làm cho các hình ảnh riêng lẻ chuyển động.

Quay video:

Kiểm tra hình ảnh sau:

Đầu tiên, chúng tôi nhập thư viện OpenCV như bình thường. Tiếp theo, chúng ta có một phương thức được gọi là VideoCapture được sử dụng để tạo đối tượng VideoCapture. Phương pháp này được sử dụng để kích hoạt camera trên máy của người dùng. Tham số cho chức năng này cho biết chương trình nên sử dụng camera tích hợp hay camera bổ sung. '0' biểu thị camera tích hợp trong trường hợp này.

Và cuối cùng, phương pháp phát hành được sử dụng để giải phóng máy ảnh trong vài mili giây.

Khi bạn tiếp tục và nhập và cố gắng thực thi mã trên, bạn sẽ nhận thấy rằng đèn camera bật sáng trong tích tắc và tắt sau đó. Lý do tại sao điều này xảy ra?

Điều này xảy ra vì không có thời gian trễ để giữ cho máy ảnh hoạt động.

Nhìn vào đoạn mã trên, chúng ta có một dòng mới được gọi là time.sleep (3) - Điều này làm cho tập lệnh dừng trong 3 giây. Lưu ý rằng tham số được truyền là thời gian tính bằng giây. Vì vậy, khi mã được thực thi, webcam sẽ được bật trong 3 giây.

Thêm cửa sổ:

Thêm một cửa sổ để hiển thị đầu ra video khá đơn giản và có thể được so sánh với các phương pháp tương tự được sử dụng cho hình ảnh. Tuy nhiên, có một chút thay đổi. Kiểm tra mã sau:

Tôi khá chắc rằng bạn có thể hiểu rõ nhất từ ​​đoạn mã trên ngoài một hoặc hai dòng.

Ở đây, chúng tôi đã xác định một mảng NumPy mà chúng tôi sử dụng để đại diện cho hình ảnh đầu tiên mà video quay được - Điều này được lưu trữ trong mảng khung .

Chúng tôi cũng đã kiểm tra - Đây là kiểu dữ liệu boolean trả về True nếu Python có thể truy cập và đọc đối tượng VideoCapture .

Kiểm tra đầu ra bên dưới:

Như bạn có thể kiểm tra, chúng tôi nhận được kết quả là True và một phần của mảng khung được in.

Nhưng chúng ta cần đọc khung hình / hình ảnh đầu tiên của video để bắt đầu, đúng không?

Để làm chính xác điều đó, trước tiên chúng ta cần tạo một đối tượng khung sẽ đọc các hình ảnh của đối tượng VideoCapture .

Như đã thấy ở trên, phương pháp imshow được sử dụng để chụp khung hình đầu tiên của video.

Trong khi đó, chúng tôi đã cố gắng chụp hình ảnh / khung hình đầu tiên của video nhưng trực tiếp quay video.

Vậy làm cách nào để quay video thay vì hình ảnh đầu tiên trong OpenCV?

Quay video trực tiếp:

Để nắm bắt video, chúng tôi sẽ sử dụng trong khi vòng lặp. Trong khi điều kiện sẽ là như vậy, cho đến khi "kiểm tra"Đúng. Nếu đúng, thì Python sẽ hiển thị các khung.

Đây là hình ảnh đoạn mã:

Chúng tôi sử dụng chức năng cvtColor để chuyển đổi từng khung hình thành hình ảnh tỷ lệ xám như đã giải thích trước đó.

waitKey (1) sẽ đảm bảo tạo ra một khung mới sau mỗi phần nghìn giây của khoảng trống.

Điều quan trọng là ở đây mà bạn lưu ý trong khi vòng lặp là hoàn toàn chơi để giúp lặp qua các khung và cuối cùng hiển thị video.

Có một trình kích hoạt sự kiện người dùng ở đây. Khi người dùng nhấn phím 'q', cửa sổ chương trình sẽ đóng lại.

OpenCV khá dễ nắm bắt, phải không? Cá nhân tôi thích khả năng đọc tốt như thế nào và người mới bắt đầu có thể bắt đầu làm việc với OpenCV nhanh như thế nào.

Tiếp theo trong bài viết này, chúng ta hãy xem cách sử dụng một ca sử dụng máy dò chuyển động rất thú vị bằng OpenCV.

Trường hợp sử dụng: Máy dò chuyển động bằng OpenCV

Bạn đã được tiếp cận bởi một công ty đang nghiên cứu hành vi của con người. Nhiệm vụ của bạn là cung cấp cho họ một chiếc webcam, có thể phát hiện chuyển động hoặc bất kỳ chuyển động nào trước mặt. Điều này sẽ trả về một biểu đồ, biểu đồ này phải chứa bao lâu người / vật thể đã ở trước máy ảnh.

Vì vậy, bây giờ chúng ta đã xác định câu lệnh vấn đề của mình, chúng ta cần xây dựng một lôgic giải pháp để tiếp cận vấn đề một cách có cấu trúc.

Hãy xem xét sơ đồ dưới đây:

Ban đầu, chúng tôi lưu hình ảnh trong một khung cụ thể.

Bước tiếp theo liên quan đến việc chuyển đổi hình ảnh sang hình ảnh mờ Gaussian. Điều này được thực hiện để đảm bảo chúng tôi tính toán sự khác biệt có thể sờ thấy giữa hình ảnh bị mờ và hình ảnh thực tế.

Tại thời điểm này, hình ảnh vẫn chưa phải là vật thể. Chúng tôi xác định ngưỡng để loại bỏ các nhược điểm như bóng và các tiếng ồn khác trong ảnh.

Các đường viền cho đối tượng được xác định sau đó và chúng tôi thêm một hộp hình chữ nhật xung quanh đối tượng như đã thảo luận trước đó trên blog.

Cuối cùng, chúng tôi tính toán thời gian mà đối tượng xuất hiện và thoát ra khỏi khung hình.

Khá dễ dàng, phải không?

Đây là đoạn mã:

Nguyên tắc tương tự cũng tuân theo ở đây. Đầu tiên, chúng tôi nhập gói và tạo đối tượng VideoCapture để đảm bảo chúng tôi quay video bằng webcam.

Vòng lặp while lặp lại qua các khung hình riêng lẻ của video. Chúng tôi chuyển đổi khung màu thành một hình ảnh tỷ lệ xám và sau đó chúng tôi chuyển đổi hình ảnh tỷ lệ xám này thành mờ Gaussian.

Chúng ta cần lưu trữ hình ảnh / khung hình đầu tiên của video, đúng không? Chúng tôi tận dụng nếu tuyên bố cho mục đích này một mình.

Bây giờ, chúng ta hãy đi sâu vào một đoạn mã nữa:

Chúng tôi sử dụng hàm absdiff để tính toán sự khác biệt giữa khung xuất hiện đầu tiên và tất cả các khung khác.

Hàm ngưỡng cung cấp một giá trị ngưỡng để nó sẽ chuyển đổi giá trị chênh lệch nhỏ hơn 30 thành màu đen. Nếu sự khác biệt lớn hơn 30, nó sẽ chuyển các pixel đó thành màu trắng. THRESH_BINARY được sử dụng cho mục đích này.

Sau đó, chúng tôi sử dụng hàm findContours để xác định vùng đường viền cho hình ảnh của chúng tôi. Và chúng tôi cũng thêm vào các đường viền ở giai đoạn này.

Các contourArea chức năng, như đã giải thích ở trên, loại bỏ tiếng ồn và bóng tối. Để làm cho nó đơn giản, nó sẽ chỉ giữ cho phần đó màu trắng, có diện tích lớn hơn 1000 pixel như chúng tôi đã xác định cho phần đó.

Sau đó, chúng ta tạo một hình hộp chữ nhật xung quanh đối tượng của chúng ta trong khung làm việc.

Và tiếp theo là đoạn mã đơn giản này:

Như đã thảo luận trước đó, khung thay đổi sau mỗi 1 mili giây và khi người dùng nhập 'q', vòng lặp bị ngắt và cửa sổ đóng lại.

Chúng tôi đã trình bày tất cả các chi tiết chính trên blog Hướng dẫn sử dụng OpenCV Python này. Một điều vẫn còn trong trường hợp sử dụng của chúng tôi là chúng tôi cần tính toán thời gian đối tượng ở trước máy ảnh.

Tính thời gian:

Chúng tôi sử dụng DataFrame để lưu trữ các giá trị thời gian trong đó phát hiện đối tượng và chuyển động xuất hiện trong khung.

Tiếp theo đó là chức năng VideoCapture như đã giải thích trước đó. Nhưng ở đây, chúng tôi có một bit cờ mà chúng tôi gọi là trạng thái. Chúng tôi sử dụng trạng thái này khi bắt đầu ghi là 0 vì ban đầu không nhìn thấy đối tượng .

Chúng tôi sẽ thay đổi cờ trạng thái thành 1 khi đối tượng đang được phát hiện như trong hình trên. Khá đơn giản phải không?

Chúng tôi sẽ tạo danh sách trạng thái cho mọi khung được quét và sau đó ghi lại ngày và giờ bằng cách sử dụng datetime trong danh sách nếu và nơi có thay đổi.

Và chúng tôi lưu trữ các giá trị thời gian trong DataFrame như được hiển thị trong sơ đồ giải thích ở trên. Chúng tôi sẽ kết thúc bằng cách ghi DataFrame vào tệp CSV như được hiển thị.

Vẽ đồ thị phát hiện chuyển động:

Bước cuối cùng trong ca sử dụng của chúng tôi để hiển thị kết quả. Chúng tôi đang hiển thị biểu đồ biểu thị chuyển động trên 2 trục. Hãy xem xét đoạn mã dưới đây:

Để bắt đầu, chúng tôi nhập DataFrame từ tệp motion_detector.py .

Bước tiếp theo liên quan đến việc chuyển đổi thời gian sang định dạng chuỗi có thể đọc được và có thể phân tích cú pháp.

Cuối cùng, DataFrame của các giá trị thời gian được vẽ trên trình duyệt bằng cách sử dụng biểu đồ Bokeh.

Đầu ra:

Tôi hy vọng bài viết này sẽ giúp bạn tìm hiểu tất cả các nguyên tắc cơ bản cần thiết để bắt đầu với OpenCV bằng Python.

Điều này sẽ rất hữu ích khi bạn đang cố gắng phát triển các ứng dụng yêu cầu nhận dạng hình ảnh và các nguyên tắc tương tự. Bây giờ, bạn cũng có thể sử dụng các khái niệm này để phát triển ứng dụng một cách dễ dàng với sự trợ giúp của OpenCV bằng Python.

Nếu bạn muốn xem thêm các bài viết về các công nghệ thịnh hành nhất trên thị trường như Trí tuệ nhân tạo, DevOps, Đạo đức Hacking, thì bạn có thể tham khảo trang web chính thức của Edureka.

Hãy tìm các bài viết khác trong loạt bài này sẽ giải thích các khía cạnh khác nhau của Python và Khoa học dữ liệu.

1. Hướng dẫn Python

2.Ngôn ngữ lập trình Python

3. Các hàm Python

4.Xử lý tệp bằng Python

5.Hướng dẫn Python Numpy

6. Học máy Scikit Learn

7. Hướng dẫn Python Pandas

8. Hướng dẫn Matplotlib

9. Hướng dẫn Tkinter

10. Hướng dẫn yêu cầu

11. Hướng dẫn PyGame

12. Web Scraping với Python

13. Hướng dẫn PyCharm

14. Hướng dẫn học máy

15. Thuật toán hồi quy tuyến tính từ đầu trong Python

16. Python cho Khoa học Dữ liệu

17. Python Regex

18. Vòng lặp trong Python

19. Dự án Python

20. Dự án Máy học

21. Mảng trong Python

22. Bộ bằng Python

23. Đa luồng trong Python

24. Câu hỏi phỏng vấn Python

25. Java và Python

26. Làm thế nào để trở thành một nhà phát triển Python?

27. Các hàm Lambda trong Python

28. Netflix sử dụng Python như thế nào?

29. Lập trình Socket trong Python là gì

30. Kết nối cơ sở dữ liệu Python

31. Golang vs Python

32. Hướng dẫn Python Seaborn

33. Cơ hội nghề nghiệp Python

Được xuất bản lần đầu tại www.edureka.co vào ngày 8 tháng 2 năm 2019.