Mục lục:

Gương nhận dạng khuôn mặt với ngăn bí mật: 15 bước (có hình ảnh)
Gương nhận dạng khuôn mặt với ngăn bí mật: 15 bước (có hình ảnh)

Video: Gương nhận dạng khuôn mặt với ngăn bí mật: 15 bước (có hình ảnh)

Video: Gương nhận dạng khuôn mặt với ngăn bí mật: 15 bước (có hình ảnh)
Video: Cài đặt mở khóa khuôn mặt - Windows Hello dễ dàng chỉ trong một phút 2024, Tháng mười một
Anonim
Gương nhận dạng khuôn mặt với ngăn bí mật
Gương nhận dạng khuôn mặt với ngăn bí mật
Gương nhận dạng khuôn mặt với ngăn bí mật
Gương nhận dạng khuôn mặt với ngăn bí mật
Gương nhận dạng khuôn mặt với ngăn bí mật
Gương nhận dạng khuôn mặt với ngăn bí mật

Tôi luôn bị hấp dẫn bởi những ngăn bí mật luôn sáng tạo được sử dụng trong truyện, phim và những thứ tương tự. Vì vậy, khi tôi xem Cuộc thi Ngăn chứa Bí mật, tôi đã quyết định tự mình thử nghiệm ý tưởng và làm một chiếc gương soi bình thường có thể mở ngăn kéo bên bí mật khi người phù hợp nhìn vào.

Bằng cách sử dụng Raspberry Pi, một số kiến thức về lập trình python và lớp 8 tại cửa hàng, chúng tôi có thể tạo ra thiết bị linh hoạt này để ẩn các đối tượng trong tầm nhìn dễ thấy mà chỉ người dùng chính xác mới có quyền truy cập.

Tôi muốn gửi lời cảm ơn đặc biệt đến những người / nền tảng này, nơi tôi cũng nhận được thông tin và tài nguyên của mình:

TeCoEd - Kênh Youtube

Emmet từ PiMyLifeUp

MJRoBot trên Hackster.io (hồ sơ)

Gaven MacDonald - Kênh Youtube

Tucker Shannon trên Thingiverse (hồ sơ)

Quân nhu

Nguồn cung cấp khung:

  • Ván gỗ (Kích thước của tấm ván này là 42 "x 7,5" x 5/16 ")
  • Khung ảnh bút chì (có kính)
  • Sơn phun
  • Keo phản quang một chiều
  • Nước lau kính & Rag
  • Gỗ MDF

Nguồn cung cấp nhận dạng khuôn mặt:

  • Raspberry Pi (Tôi đã sử dụng Pi 3 B + nhưng có các tùy chọn khác)
  • Mô-đun máy ảnh
  • Động cơ bước

Công cụ:

  • Bàn cưa
  • Jig Saw
  • Giấy nhám
  • Băng keo
  • Đo lường
  • Cây kéo
  • Bình xịt
  • máy in 3D
  • Keo siêu dính

Bước 1: Cắt cho Khung hộp

Các vết cắt cho khung hộp
Các vết cắt cho khung hộp
Các vết cắt cho khung hộp
Các vết cắt cho khung hộp
Các vết cắt cho khung hộp
Các vết cắt cho khung hộp
Các vết cắt cho khung hộp
Các vết cắt cho khung hộp

Tôi đã mua một khung ảnh từ cửa hàng đồ cũ. Chỉ là một cảnh báo, hãy đảm bảo rằng các tấm ván tạo nên khung rộng ít nhất là 1 1/2 . Điều này để bạn có thể dán các tấm gỗ khác lên đó với đủ không gian để làm việc. Ngoài ra, hãy đảm bảo kính trong khung hoàn toàn rõ ràng. Tôi vô tình mua một chiếc kính mờ và sau đó phải mua một khung khác chỉ dành cho kính trong. Vì khung của tôi được sử dụng nên các phép đo cho khung hộp có thể khác nhau.

  • Đặt khung theo hướng dọc. Đo các cạnh dài (LS) của mặt lỗ kính trên khung với thêm ½”ở cả trên và dưới. (tức là thêm một inch vào cạnh dài của phép đo lỗ kính. Ghi lại và dán nhãn LSM (Đo cạnh dài).
  • Tương tự, đo mặt trên của lỗ và thêm thêm 1”. Ghi lại điều này và dán nhãn SSM (Đo cạnh ngắn).
  • Lấy bảng của bạn và với một cái cưa bàn, cắt hai LSM x 2”và hai SSM x 2”.
  • Lấy một trong các vết cắt LSM và đo một hình chữ nhật 2”x1” cách đáy 1”và cạnh trái và phải ½” (như trong hình 3).
  • Sử dụng một hình ghép để cắt lỗ. Sau đó dùng giấy nhám để chà nhám các cạnh.

Bước 2: Cắt cho ngăn kéo

Các vết cắt cho ngăn kéo
Các vết cắt cho ngăn kéo
Các vết cắt cho ngăn kéo
Các vết cắt cho ngăn kéo
Các vết cắt cho ngăn kéo
Các vết cắt cho ngăn kéo
Các vết cắt cho ngăn kéo
Các vết cắt cho ngăn kéo

Bây giờ chúng ta sẽ bắt đầu xây dựng ngăn kéo (còn gọi là Ngăn bí mật).

  • Cắt bỏ hai cạnh 4”x 1”, 3 ⅜”x 1” (cạnh sau), 4 ¼”x 1 ¼” (cạnh trước) và 4”x 3 ⅜” (nền).
  • Dán mặt 4”x 1” đầu tiên dọc theo mặt 4”của bệ. Tôi đặt một vài tờ giấy gấp dưới mặt bệ để nó được nâng lên một chút, bằng cách này, nó sẽ không kéo vào lỗ mà tôi đã khoét trên tấm ván LS. Để khô trong 30 phút.
  • Tương tự, dán cạnh 3 ⅜”x 1” dọc theo cạnh 3 ⅜”của tấm nền. Để khô trong 30 phút. Sau đó, dán mặt thứ hai 4”x 1” vào mặt đối diện của mặt thứ nhất. Để khô trong 30 phút.
  • Đặt cạnh trước sang một bên. Nó sẽ là thứ cuối cùng được dán vào ngăn kéo.
  • Khi hoàn thành, hãy kiểm tra xem nó có vừa với lỗ mà bạn đã ghép vào tấm ván LSM hay không. Nếu không, hãy chà nhám lỗ cho đến khi ngăn kéo trượt ra vào dễ dàng và không bị kéo.

Bước 3: Đặt khung lại với nhau

Gắn khung lại với nhau
Gắn khung lại với nhau
Gắn khung lại với nhau
Gắn khung lại với nhau
Gắn khung lại với nhau
Gắn khung lại với nhau

Với tất cả các bộ phận đã hoàn thành, chúng ta có thể bắt đầu lắp ráp toàn bộ khung.

  • Dán tấm ván LSM vào tâm với lỗ kính với ½”mỗi bên. Đảm bảo rằng nó được dán cách lỗ ½”(như trong hình 1). Để khô trong 30 phút.
  • Dán tấm ván SSM đầu tiên với mép chạm vào mặt trong của tấm ván LSM vừa được dán. (Sử dụng thước để đảm bảo nó được dán thẳng). Để khô trong 30 phút.
  • Lấy mặt LSM còn lại và dán tương tự như hình đầu tiên. Đảm bảo rằng nó cách lỗ ½”và SSM vừa được gắn vào được dán ở mặt trong của tấm ván. Để khô trong 30 phút.
  • Keo SSM cuối cùng ở cạnh trên. Vì bạn có hai LSM ở cả hai bên, tùy thuộc vào cách bạn gắn chúng thẳng như thế nào, bạn có thể cần phải chà nhám các mặt của SSM xuống để đảm bảo rằng nó vừa vặn (đôi khi vết cắt của tôi bị đứt). Để khô trong 30 phút.
  • Đo khoảng trống nhỏ giữa đáy ngăn kéo và khung. Cắt một miếng gỗ MDF với số đo này là 4 ". Bạn muốn làm cho miếng này gần với ngăn kéo nhưng không chạm vào nó. Nó nhằm hỗ trợ ngăn kéo với ma sát tối thiểu.
  • Khi tất cả hoàn thành, tôi phun sơn khung sao cho tất cả các mảnh khớp với nhau.

Bước 4: Đối với gương

Đối với gương
Đối với gương
Đối với gương
Đối với gương
Đối với gương
Đối với gương
Đối với gương
Đối với gương

Keo dán phim một chiều mà tôi mua ngoài Amazon có giá khoảng 10 đô la. Có những loại chất lượng tốt hơn nhưng đắt hơn một chút nếu bạn quan tâm. Cái mà tôi sử dụng phản chiếu nhưng bạn có thể biết nó không phải là một chiếc gương thông thường mà bạn sẽ thấy trong nhà. Những cái đắt tiền hơn sẽ giúp bạn có được vẻ ngoài đó.

  • Làm sạch kính bằng nước lau kính cả hai mặt.
  • Mở lớp keo một chiều và đặt kính lên trên. Cắt bỏ lớp keo dính để có ít nhất ½”dư thừa trên mỗi mặt của kính.
  • Đặt kính sang một bên và làm ướt một mặt của nó bằng nước. Sau đó bóc lớp áo nhựa ra khỏi lớp keo một chiều và xịt nước vào mặt mới tiếp xúc.
  • Đặt mặt ướt của kính lên mặt ướt của keo. Ngồi trong 30 phút.
  • Lật lại và dùng ngón tay cái để làm phẳng bất kỳ bong bóng nào giữa keo và thủy tinh. Sau đó, cắt phần keo thừa xung quanh các cạnh.

Bước 5: Cài đặt Raspbian Stretch

Đây là lần đầu tiên tôi đi sâu vào môi trường Raspberry Pi, tôi bắt đầu tìm kiếm hướng dẫn về cách cài đặt hệ điều hành. Cuối cùng tôi đã tìm thấy một hướng dẫn đơn giản trên Youtube của TeCoEd về quá trình cài đặt Stretch vào thẻ SD (kèm theo một phần giới thiệu khá đáng yêu). Đây là liên kết đến hướng dẫn đó:

Về bản chất, tất cả những gì bạn cần làm là:

  • Định dạng thẻ SD bằng cách chọn Drive của bạn >> Công cụ Drive >> Định dạng. Tải xuống tệp ZIP cho Raspian Stretch (tìm thấy tại đây:
  • Flash hình ảnh hệ điều hành vào thẻ SD. TeCoEd đã sử dụng Win32 Disk Imager để hoàn thành việc này. Tôi đã kết thúc việc cài đặt balenaEtcher có vẻ đơn giản hơn một chút. (Đây là liên kết tải xuống balenaEtcher:
  • Khi ở trong balenaEtcher, hãy chọn “Flash From File” và chọn tệp ZIP đã tải xuống trước đó. Tiếp theo, chọn thẻ SD mong muốn (nếu không được chọn tự động). Sau đó nhấn vào nút flash ngon ngọt và chờ đợi điều kỳ diệu xảy ra.

Sau khi được cài đặt trên thẻ SD, bạn có thể lắp nó vào Raspberry Pi và thực hiện quy trình thiết lập Pi chung.

Bước 6: Cài đặt OpenCV

Bây giờ chuyển sang các phần Định hướng nhận dạng khuôn mặt hơn. Để nhận dạng khuôn mặt, chúng ta phải tải xuống thư viện OpenCV chứa rất nhiều công cụ để làm việc với thị giác máy tính.

Cài đặt OpenCV là phần khó khăn nhất trong khía cạnh phần mềm đối với tôi. Nhưng sau khi làm theo nhiều hướng dẫn, cuối cùng tôi đã tìm thấy một hướng dẫn của Emmet từ PiMyLifeUp đã thực hiện thủ thuật được tìm thấy ở đây:

Tôi sẽ không đi qua các bước này vì bạn sẽ phù hợp hơn khi theo dõi chúng từ liên kết (với các giải thích cho sẵn và khả năng sao chép và dán trực tiếp từ trang web dễ dàng hơn).

Bước 7: Bật / Kiểm tra máy ảnh

Bật / Kiểm tra Máy ảnh
Bật / Kiểm tra Máy ảnh
Bật / Kiểm tra Máy ảnh
Bật / Kiểm tra Máy ảnh

Sau khi cài đặt OpenCV, phần còn lại của hành trình của tôi đã hoàn thành bằng cách sử dụng hướng dẫn của MJRoBot trên Hackster.io được tìm thấy tại đây:

Trước khi chúng ta bắt đầu, tôi muốn nhắc bạn rằng tôi không phải là người sáng tạo ban đầu của những tập lệnh này nhưng cuối cùng đã sửa đổi các phần của chúng.

Để bắt đầu, chúng ta nên kiểm tra máy ảnh để đảm bảo rằng chúng ta có thể quay video trên màn hình. Tôi đã dành khoảng một giờ để cố gắng chạy tập lệnh được cung cấp trong Bước 3 của MJRoBot. Như cuộc sống sẽ có nó, chúng tôi thực sự cần phải kích hoạt máy ảnh trên Raspberry Pi (hóa ra có thể là một ý kiến hay khi đọc các hướng dẫn được cung cấp… mmm nah). Vì vậy, sau khi kết nối Máy ảnh với đúng cổng của nó, hãy làm theo các bước sau:

  • Mở một đầu cuối lệnh và nhập sudo raspi-config
  • Chọn “Bật máy ảnh” (tùy chọn này có thể được tìm thấy trong tùy chọn thiết bị)
  • Nhấn Enter"
  • Đi tới “Hoàn tất” và bạn sẽ được nhắc khởi động lại

Sau đó, hãy làm theo các bước sau:

  • Đi tới Menu chính của Raspberry (Trên cùng bên trái)
  • Sở thích
  • Cấu hình Raspberry Pi
  • Giao diện
  • Sau đó, trong Máy ảnh, chọn “Đã bật”
  • Sau đó "OK"

Bây giờ bạn sẽ có thể chạy thành công tập lệnh này từ hướng dẫn của MJRoBot để kiểm tra máy ảnh (hãy nhớ rằng tất cả mã này cùng với mô tả chuyên sâu hơn được tìm thấy trong liên kết được cung cấp ở trên cho hướng dẫn của MJRobot):

nhập numpy dưới dạng np

import cv2 cap = cv2. VideoCapture (0) cap.set (3, 640) # set Width cap.set (4, 480) # set Height while (True): ret, frame = cap.read () frame = cv2. lật (khung, -1) # Lật máy ảnh theo chiều dọc màu xám = cv2.cvtColor (khung, cv2. COLOR_BGR2GRAY) cv2.imshow ('khung', khung) cv2.imshow ('xám', xám) k = cv2.waitKey (30) & 0xff if k == 27: # nhấn 'ESC' để thoát break cap.release () cv2.destroyAllWindows ()

Đoạn mã trước đó sẽ hiển thị hai cửa sổ, một cửa sổ có màu và cửa sổ kia có thang độ xám. Nếu bạn làm được điều đó đến nay, tôi nghĩ bạn xứng đáng được thưởng thức một chiếc bánh sandwich ngon.

Bước 8: Thu thập dữ liệu và dữ liệu đào tạo

Thu thập dữ liệu và dữ liệu đào tạo
Thu thập dữ liệu và dữ liệu đào tạo
Thu thập dữ liệu và dữ liệu đào tạo
Thu thập dữ liệu và dữ liệu đào tạo
Thu thập dữ liệu và dữ liệu đào tạo
Thu thập dữ liệu và dữ liệu đào tạo

Trong hướng dẫn được cung cấp, tác giả sẽ đi sâu hơn về các quy trình của mã sẽ sớm được cung cấp, nhưng vì đây là những hướng dẫn về cách tạo ra gương này nên tôi sẽ không đi sâu vào lịch sử cũng như cơ chế phức tạp. Tuy nhiên, tôi khuyên bạn nên dành một tháng trong đời để đọc về hai điều này vì chúng có thể giúp ích cho tâm trí của bạn.

Chỉ còn khoảng ba tập lệnh nữa để chạy trước khi chúng ta có thể làm cho tất cả điều này hoạt động. Đầu tiên là để thu thập dữ liệu, thứ hai là để đào tạo nó và cuối cùng là thực sự để công nhận. Việc thu thập dữ liệu yêu cầu hình ảnh thực tế của khuôn mặt được chụp và lưu trữ ở một nơi cụ thể để đào tạo. Người tạo ra mã này rất đơn giản để thực hiện tất cả những điều này, vì vậy tôi khuyên bạn nên làm theo các hướng dẫn sau để tránh đau đầu.

Mở một dòng lệnh và tạo một thư mục mới đặt tên cho nó là một cái gì đó thú vị (tôi gọi là FaceRec của tôi)

mkdir FaceRec

Bây giờ, hãy thay đổi thư mục thành FaceRec và tạo một thư mục con đảm bảo đặt tên cho nó là tập dữ liệu

cd FaceRec

tập dữ liệu mkdir

Trong khi thực hiện, chúng tôi cũng có thể tạo thư mục con khác có tên là giảng viên

huấn luyện viên mkdir

Bây giờ bạn có thể chạy và làm theo hướng dẫn của tập lệnh đầu tiên sẽ chụp ảnh người dùng. (Chỉ cần lưu ý, hãy đảm bảo nhập id người dùng là 1, 2, 3, v.v.)

import cv2import os cam = cv2. VideoCapture (0) cam.set (3, 640) # set video width cam.set (4, 480) # set video height face_detector = cv2. CascadeClassifier ('haarcascade_frontalface_default.xml') # Cho mỗi người, nhập một id khuôn mặt số face_id = input ('\ n nhập id người dùng kết thúc nhấn ==>') print ("\ n [INFO] Đang bắt đầu chụp khuôn mặt. Nhìn vào máy ảnh và đợi…") # Khởi tạo số lượng khuôn mặt lấy mẫu riêng lẻ count = 0 while (True): ret, img = cam.read () img = cv2.flip (img, -1) # lật hình ảnh video theo chiều dọc màu xám = cv2.cvtColor (img, cv2. COLOR_BGR2GRAY) face = face_detector.detectMultiScale (màu xám, 1,3, 5) cho (x, y, w, h) trong các khuôn mặt: cv2.rectangle (img, (x, y), (x + w, y + h), (255, 0, 0), 2) count + = 1 # Lưu hình ảnh đã chụp vào thư mục tập dữ liệu cv2.imwrite ("dataset / User." + Str (face_id) + '.' + Str (count) + ".jpg", gray [y: y + h, x: x + w]) cv2.imshow ('image', img) k = cv2.waitKey (100) & 0xff # Nhấn 'ESC' để thoát video nếu k == 27: break elif count> = 30: # Lấy mẫu 30 khuôn mặt và dừng video k print ("\ n [INFO] Đang thoát chương trình và nội dung dọn dẹp") cam.release () cv2.destroyAllWindows ()

Tại thời điểm này, hãy chắc chắn rằng bạn đã cài đặt gối trên Pi. Nếu không, hãy chạy lệnh:

pip cài đặt gối

Sau khi hoàn thành, bạn có thể chạy tập lệnh đào tạo (tập lệnh thứ hai), tập lệnh này sẽ cung cấp liền mạch cho bạn tệp.yaml sẽ được sử dụng trong tập lệnh cuối cùng

import cv2import numpy as np from PIL import Image import os # Path for face image database path = 'dataset' Recogzer = cv2.face. LBPHFaceRecognizer_create () detector = cv2. CascadeClassifier ("haarcascade_frontalface_default.xml"); # hàm lấy hình ảnh và dữ liệu nhãn def getImagesAndLabels (path): imagePaths = [os.path.join (path, f) for f in os.listdir (path)] faceSamples = ids = for imagePath trong imagePaths: PIL_img = Image.open (imagePath).convert ('L') # chuyển nó thành thang độ xám img_numpy = np.array (PIL_img, 'uint8') id = int (os.path.split (imagePath) [- 1]. split (".") [1]) face = detector.detectMultiScale (img_numpy) cho (x, y, w, h) trong các khuôn mặt: faceSamples.append (img_numpy [y: y + h, x: x + w]) ids.append (id) return faceSamples, id print ("\ n [INFO] Đào tạo các khuôn mặt. Sẽ mất vài giây. Chờ…") khuôn mặt, ids = getImagesAndLabels (đường dẫn) Recogzer.train (khuôn mặt, np.array (id)) # Lưu mô hình vào trainer / trainingr.yml Recogzer.write ('trainer / trainr.yml') # Recogzer.save () hoạt động trên Mac, nhưng không hoạt động trên Pi # In số khuôn mặt được đào tạo và in kết thúc chương trình ("\ n [INFO] {0} khuôn mặt được huấn luyện. Đang thoát chương trình".format (len (np.unique (ids))))

Điều thú vị về bộ tập lệnh này là nhiều khuôn mặt có thể được nhập vào hệ thống, nghĩa là nhiều cá nhân có thể truy cập vào các phần bên trong của bản sao nếu muốn.

Ở bên dưới, tôi có sẵn tập lệnh Ghi dữ liệu và tập lệnh Đào tạo để tải xuống.

Bước 9: Thời gian nhận dạng khuôn mặt

Thời gian nhận dạng khuôn mặt
Thời gian nhận dạng khuôn mặt
Thời gian nhận dạng khuôn mặt
Thời gian nhận dạng khuôn mặt

Cuối cùng, chúng ta có thể chạy tập lệnh của trình nhận dạng. Nhiều mã hơn đã được thêm vào tập lệnh này để làm cho quá trình vận động hoạt động, vì vậy tôi sẽ giải thích các phần đó kỹ hơn một chút. Tôi sẽ chia nó thành nhiều phần nhưng tôi sẽ đặt toàn bộ kịch bản ở cuối bước nếu đó là điều bạn đang muốn.

Chúng tôi sẽ bắt đầu bằng cách nhập tất cả các mô-đun chúng tôi sẽ cần và sau đó đặt chế độ GPIO thành GPIO. BCM

nhập numpy dưới dạng np

nhập thời gian nhập hệ điều hành nhập RPi. GPIO dưới dạng GPIO GPIO.setwarnings (Sai) GPIO.setmode (GPIO. BCM)

Danh sách tiếp theo này có tên ControlPin là một dãy số đại diện cho các chân đầu ra sẽ được sử dụng cho động cơ bước của chúng ta.

ControlPin = [14, 15, 18, 23]

Vòng lặp for đặt các chân này làm Đầu ra và sau đó đảm bảo rằng chúng đã được tắt. Tôi vẫn còn một số mã ở đây để cho phép đóng ngăn kéo bằng cách nhấn nút nhưng thay vào đó tôi quyết định sử dụng bộ hẹn giờ.

GPIO.setup (ControlPin , GPIO. OUT)

GPIO.output (ControlPin , 0) GPIO.setup (2, GPIO. IN, pull_up_down = GPIO. PUD_DOWN)

Hai biến tiếp theo là trình tự chúng ta sẽ sử dụng để điều khiển động cơ. Tôi biết được thông tin này từ một video tuyệt vời của Gaven MacDonald mà tôi thực sự khuyên bạn nên xem khi anh ấy đi sâu vào không chỉ mã mà còn cả động cơ thực tế (tìm thấy tại đây: https://www.youtube.com/embed/Dc16mKFA7Fo). Về bản chất, mỗi chuỗi sẽ được lặp lại thông qua việc sử dụng các vòng lặp for lồng nhau trong các hàm openComp và closeComp sắp tới. Nếu bạn nhìn kỹ thì seq2 hoàn toàn ngược lại với seq1. Yup, bạn đoán nó. Một là để chuyển động cơ về phía trước và cái kia là để chuyển động ngược lại.

seq1 =

seq2 =

Bắt đầu với hàm openComp của chúng tôi, chúng tôi tạo một vòng lặp for sẽ lặp lại 1024 lần. Theo video của MacDonald, 512 lần lặp lại sẽ cung cấp một vòng quay đầy đủ của động cơ và tôi nhận thấy rằng khoảng hai lần quay là độ dài tốt nhưng điều này có thể được điều chỉnh tùy thuộc vào kích thước của từng cá nhân. Vòng lặp for tiếp theo bao gồm 8 lần lặp để tính đến 8 mảng được tìm thấy trong seq1 và seq2. Và cuối cùng, vòng lặp for cuối cùng lặp lại bốn lần cho bốn mục được tìm thấy trong mỗi mảng này cũng như 4 chân GPIO mà chúng tôi đã kết nối với động cơ của mình. Dòng dưới đây chọn chân GPIO và sau đó bật hoặc tắt nó tùy thuộc vào lần lặp lại. Dòng sau cung cấp một số thời gian đệm để động cơ của chúng tôi không quay. Sau khi động cơ quay để di chuyển ngăn kéo ra, nó sẽ ngủ trong 5 giây trước khi tiếp tục. Thời gian này có thể được điều chỉnh tại đây hoặc bạn có thể bật mã nhận xét cho phép sử dụng nút nhấn để chuyển tiếp với tập lệnh thay vì bộ đếm thời gian.

cho tôi trong phạm vi (1024):

cho nửa bước trong phạm vi (8): cho pin trong phạm vi (4): GPIO.output (ControlPin [pin], seq1 [nửa bước] [pin]) time.sleep (0,001) '' 'trong khi Đúng: nếu GPIO.input (2) == GPIO. LOW: break; '' 'time.sleep (5)

Hàm closeComp hoạt động theo cách tương tự. Sau khi động cơ di chuyển trở lại, tôi tiến hành đặt các chân GPIO cuối cùng của chúng tôi ở mức thấp để đảm bảo rằng chúng tôi không lãng phí bất kỳ năng lượng nào và sau đó tôi thêm ba giây nữa trước khi tiếp tục.

cho tôi trong phạm vi (1024):

cho nửa bước trong phạm vi (8): cho pin trong phạm vi (4): GPIO.output (ControlPin [pin], seq2 [nửa bước] [pin]) time.sleep (0,001) print ("Ngăn đã đóng") GPIO.output (ControlPin [0], 0) GPIO.output (ControlPin [3], 0) time.sleep (3)

Phần lớn phần tiếp theo được sử dụng để thiết lập máy ảnh và bắt đầu nhận dạng khuôn mặt. Một lần nữa, hướng dẫn của MKRoBot sẽ đi sâu vào các bộ phận hơn nhưng hiện tại, tôi chỉ hiển thị các bộ phận được sử dụng cho gương.

Đầu tiên, tôi đã thay đổi tên danh sách để tên của tôi nằm trong chỉ mục mà tôi đã gán nó trong khi thu thập dữ liệu (trong trường hợp của tôi là 1). Và sau đó tôi đặt phần còn lại của các giá trị thành Không vì tôi không còn khuôn mặt nào nữa trong tập dữ liệu.

names = ['Không có', 'Daniel', 'Không có', 'Không có', 'Không có', 'Không có']

Một vài dòng mã cuối cùng của chúng tôi được triển khai trong vòng lặp thicc. Tôi đã tạo một biến để lưu trữ độ tin cậy dưới dạng số nguyên (intConfidence) trước khi độ tin cậy của biến được chuyển thành một chuỗi. Sau đó, tôi sử dụng câu lệnh if để kiểm tra xem độ tin cậy có lớn hơn 30 hay không và liệu id (người mà máy tính đang phát hiện, trong trường hợp này là “Daniel”) có bằng tên của tôi không. Sau khi điều này được xác nhận, hàm openComp được gọi là (như đã giải thích trước đó) di chuyển động cơ, khởi động sau 5 giây và sau đó tiến hành đóngComp để chuyển động cơ theo hướng ngược lại và thực hiện một số dọn dẹp trước khi tiếp tục với vòng lặp thicc.

nếu intConfidence> 30 và id == 'Daniel':

openComp () closeComp ()

Một lỗi mà tôi tìm thấy ở đây là đôi khi sau khi closeComp trả về, mã vẫn tiếp tục nhưng câu lệnh if có điều kiện lại được phát hiện là đúng như thể nó đang đọc nguồn cấp dữ liệu video vẫn còn trong bộ đệm. Mặc dù điều đó không xảy ra bất cứ lúc nào nhưng tôi vẫn chưa tìm ra cách để đảm bảo điều đó không bao giờ xảy ra, vì vậy nếu ai có bất kỳ ý tưởng nào, hãy cho tôi biết trong phần nhận xét.

Đây là toàn bộ tập lệnh ở cùng một nơi (và ngay bên dưới đây là bản có thể tải xuống):

nhập cv2

import numpy as np import os import time import RPi. GPIO as GPIO GPIO.setwarnings (False) GPIO.setmode (GPIO. BCM) ControlPin = [14, 15, 18, 23] for i in range (4): GPIO.setup (ControlPin , GPIO. OUT) GPIO.output (ControlPin , 0) GPIO.setup (2, GPIO. IN, pull_up_down = GPIO. PUD_DOWN) seq1 =

Bước 10: Gắn Pi và kết nối động cơ

Gắn Pi và kết nối động cơ
Gắn Pi và kết nối động cơ
Gắn Pi và kết nối động cơ
Gắn Pi và kết nối động cơ
Gắn Pi và kết nối động cơ
Gắn Pi và kết nối động cơ

Việc gắn Raspberry Pi vào khung khá đơn giản. Tôi đã thiết kế một khuỷu tay nhỏ 90 độ với một mặt có lỗ và mặt còn lại hoàn toàn bằng phẳng. Sau khi in 3D, hai trong số này có thể được gắn bằng vít vào Raspberry Pi trên các lỗ gắn của nó (tôi đã sử dụng hai lỗ trên mỗi bên của chân GPIO).

Sau đó, tôi tiến hành sử dụng keo siêu dính trên các mặt đối diện của khuỷu tay in 3D để dán chữ Pi ngay phía trên ngăn kéo trên khung. Sau khi để keo khô, tôi có thể tháo hoặc thay thế Pi vào vị trí một cách đơn giản và thuận tiện chỉ bằng hai con vít. Tôi có.stl cho khuỷu tay được liên kết bên dưới.

Bây giờ chỉ cần kết nối trình điều khiển động cơ với PI bằng IN1, IN2, IN3, IN4 kết nối với GPIO 14, 15, 18, 23 tương ứng. Cuối cùng, kết nối các chân 5v và Ground của bảng điều khiển với đầu ra 5v và chân Ground của Pi.

Đây là liên kết đến Pi's Pinout để tham khảo:

Bước 11: Gắn máy ảnh

Gắn máy ảnh
Gắn máy ảnh
Gắn máy ảnh
Gắn máy ảnh
Gắn máy ảnh
Gắn máy ảnh

Việc lắp Máy ảnh kém chắc chắn hơn Pi một chút nhưng phương pháp này đã hoàn thành công việc. Sau khi thiết kế và in một chùm mỏng với 2 lỗ ở mỗi đầu, tôi đã gắn chùm tia vào Rasberry Pi thông qua lỗ gắn của nó. Sau đó, chỉ cần gắn máy ảnh vào đầu đối diện của chùm tia bằng một vít khác. Ta-da! Nó trông rất đẹp.

Bước 12: Tạo và lắp cơ chế di chuyển ngăn kéo

Tạo và lắp cơ chế di chuyển ngăn kéo
Tạo và lắp cơ chế di chuyển ngăn kéo
Tạo và lắp cơ chế di chuyển ngăn kéo
Tạo và lắp cơ chế di chuyển ngăn kéo
Tạo và gắn kết cơ chế di chuyển ngăn kéo
Tạo và gắn kết cơ chế di chuyển ngăn kéo

Bước này đã được thực hiện dễ dàng nhờ những món quà nhân từ của cộng đồng nhà sản xuất. Sau khi tìm kiếm nhanh trên Thingiverse, tôi đã có thể tìm thấy một bộ truyền động tuyến tính được tạo bởi TucksProjects (tìm thấy ở đây: https://www.thingiverse.com/thing:2987762). Tất cả những gì còn lại cần làm là gắn nó vào thẻ SD và để máy in thực hiện công việc.

Cuối cùng, tôi đã sử dụng Fusion 360 và chỉnh sửa sự thúc đẩy vì trục của động cơ của tôi quá lớn so với trục do TucksProjects cung cấp. Tôi có.stl cho điều đó bên dưới. Sau khi in xong, chúng ta chỉ cần lắp ráp nó bằng cách đặt trục động cơ vào trục động cơ, sau đó gắn 2 vít bên động cơ và vỏ hộp bằng 2 vít (nhớ đặt giá đỡ vào giữa trước khi đóng nó lại). Cuối cùng, tôi phải cắt một inch ra khỏi giá để nó vừa với ngăn kéo và khung.

Bây giờ, tất cả những gì còn lại là gắn cơ chế vào khung và ngăn kéo. "BuT hOW wiLL wE Do tHiS?" bạn hỏi… yup, hãy nói điều đó với tôi: Super Glue. Như trong các hình trên, bạn chỉ cần đặt cơ cấu chống vào dưới cùng của khung và đẩy nó lên trên miếng gỗ mà ngăn kéo trượt lên. Điều quan trọng ở đây là bạn phải cố gắng để giá đỡ / cơ cấu càng song song với khung càng tốt để khi cơ cấu di chuyển, nó sẽ đẩy ngăn kéo thẳng và không lệch một góc. Sau khi keo khô, bạn phết thêm một ít keo lên mép giá và di chuyển ngăn kéo vào vị trí rồi để khô. Sau khi hoàn thành, chúng tôi có một cơ chế chắc chắn để trượt ngăn kéo bí mật của chúng tôi vào và ra.

Bước 13: Thêm các tông phía sau gương

Thêm các tông phía sau gương
Thêm các tông phía sau gương
Thêm các tông phía sau gương
Thêm các tông phía sau gương
Thêm các tông phía sau gương
Thêm các tông phía sau gương

Để làm cho phim hai chiều này trông giống như gương hơn, tôi thấy rằng nó phục vụ tốt mục đích của chúng tôi là đặt các tông phía sau kính. Các tông được sử dụng là loại đi kèm với khung nhưng bất kỳ miếng nào được cắt cho vừa vặn sẽ hoạt động. Điều này cũng đảm bảo không có ánh sáng từ đèn LED của máy ảnh, bộ điều khiển động cơ hoặc số Pi hiển thị ở phía bên kia của gương. Với mọi thứ ở vị trí của nó, hãy sử dụng bút chì để đánh dấu vị trí đặt máy ảnh trên bìa cứng. Sau đó, dùng dao cạo để cắt một hình chữ nhật để máy ảnh có thể nhìn xuyên qua khi nó ở đúng vị trí.

Bước 14: Đưa vào mảnh ghép cuối cùng

Đưa vào mảnh ghép cuối cùng
Đưa vào mảnh ghép cuối cùng
Đưa vào mảnh ghép cuối cùng
Đưa vào mảnh ghép cuối cùng

Việc cuối cùng cần làm là đặt phần ngăn kéo đã được đặt sang một bên trước đó. Di chuyển động cơ để ngăn kéo nhô ra ngoài. Sau đó, dán phần phía trước vào sao cho phần ngăn kéo được chính giữa (nên có một chút móc treo ở tất cả các bên. Sau đó, bạn có thể chỉ cần treo nó lên tường.

Bước 15: Chung kết

Finale
Finale
Finale
Finale

Đây là bạn có nó! Có một số cải tiến có thể được thực hiện như thêm nút nhấn đó, mua một số phim hai chiều tốt hơn và sửa lỗi đó trong mã nhưng tất cả, nó đều hoàn thành công việc: nó trông giống như một tấm gương, nó nhận ra những điều đã định trước khuôn mặt của người dùng và nó mở ngăn kéo nhỏ dễ thương đó. Như mọi khi, tôi rất muốn nghe những suy nghĩ, câu hỏi và hồi ký của bạn trong phần bình luận bên dưới.

Đánh giá chung: 10/10

Nhận xét: # wouldNotTryAgain… trừ khi tôi có thể làm theo hướng dẫn này;)

Thử thách ngăn bí mật
Thử thách ngăn bí mật
Thử thách ngăn bí mật
Thử thách ngăn bí mật

Giải thưởng lớn trong Thử thách ngăn bí mật

Đề xuất: