MJPG Streamer vs Intel Galileo - Truyền hình ảnh từ webcam trong mạng LAN với Intel Galileo

I. Giới thiệu

Vấn đề truyền hình ảnh từ webcam trong mạng LAN không phải là một vấn đề mới trong việc lập trình nhúng. Ví dụ như trên Raspberry Pi, chúng ta hoàn toàn có thể sử dụng MJPG Streamer để làm được việc này. Tuy nhiên, khác với Raspberry Pi, Intel Galieo không đơn giản như vậy, bởi vì chưa có một bài viết hoàn chỉnh chỉ về vấn đề này trên cộng đồng Intel Galileo thế giới. Vì vậy, mình muốn đóng góp một phần nhỏ để các bạn có thể làm được điều này trên con Intel Galileo của mình (không phân biệt Intel Galileo Gen 1 hay Intel Galileo Gen 2 nhé).

Làm tấm ảnh demo cho nó "nguy hiểm" một tí ha devil

II. Vì sao chúng ta nên dùng MJPG streamer để stream hình ảnh từ camera?

Với kinh nghiệm của mình, ở những dự án không quá lớn và dự án đó cần truyền tải từ 01 => 03 camera thì việc xây dựng một nền tảng truyền dữ liệu riêng là không cần thiết, vì quá trình truyền tải hình ảnh không quá nặng và sẽ không gây ra tình trạng nghẽn mạng. Trong trường hợp này, chúng ta nên dùng một chương trình nguồn mở nào đó để giúp chúng ta làm việc cơ bản nhất là lấy giữ liệu từ webcam và truyền (stream) nó trong mạng. Và với kinh nghiệm của mình đã từng trải nghiệm trên nhiều máy tính nhúng như Raspberry Pi 1, 2, Intel Galileo Gen 1, 2 thì cả 4 mạch đều có thể chạy ngon lành và rất ổn định. Trong phạm vi bài viết này, mình chỉ xin giới thiệu MJPG streamer trên Intel Galileo Gen 1 và 2, còn mạch Raspberry Pi thì rất đơn giản và xin nhường cho một bạn khác viết về nó yes.

Để đơn giản hóa cho quá trình cài đặt thì mình đã build sẵn một bản chạy ổn định trên cả Intel Galileo Gen 1 và Intel Galileo Gen 2, vì vậy, các bạn chỉ việc tải về và chạy thôi à :). Ngoài ra, mình xin nói thêm về chuẩn MJPEG, đó là một chuỗi các hình ảnh liên tiếp nhau giống file gif vậy á. Nhưng kĩ thuật làm đơn giản hơn nhiều => nhanh => ứng dụng được trong việc truyền thời gian thực.

III. Cài đặt

1. Cài đặt hệ điều hành Linux Yocto

Nếu chưa cài, thì các bạn cài theo hướng dẫn tại đây.

2. Kết nối mạng

Như tiêu đề bài viết, chúng ta cần phải nối mạng cho Intel Galileo, và mạng này cần phải đi Internet được nha (chỉ là để tải source về Intel Galileo thôi mà angel). Để kết nối mạng thì có nhiều cách lắm, như là gắn dây LAN hoặc dùng mini pci driver như ở bài viết này của mình.

3. Truy cập Linux

Vì đã có mạng nên con Intel Galileo sẽ có một địa chỉ IP. Để biết được nó thì bạn vào trang quản lý modem / router và vào mục DHCP > DHCP Client list tìm địa chỉ IP nào có hostname là galileo cheeky.

Giả sử mình có địa chỉ IP là 192.168.200.68 thì mình sẽ cài đặt putty với các thông số như hình dưới.

4. Cài đặt MJPG streamer

Việc cài đặt vô cùng đơn giản, các bạn chỉ cần làm tuần tự các lệnh sau (phần phía sau dấu # các bạn không cần copy)

cd /home #chuyển về tư mục /home
wget http://k1.arduino.vn/img/2016/01/14/0/1895_123450-1452738080-0-mjpg-streamer.zip -O mjpg-streamer.zip #tải file nén các file thực thi về và lưu dưới tên mjpg-streamer.zip
unzip mjpg-streamer.zip #giải nén
mv mjpg_streamer/ /usr/bin/
cd /usr/bin/
mv mjpg_streamer/ mjpg-streamer/
mv mjpg-streamer/mjpg_streamer ./
chmod 0755 mjpg_streamer

Như vậy là bạn đã cài đặt xong.

5. Chạy thử

Để chạy được mjpg_streamer, bạn cần phải có một camera, vậy loại camera là tối ưu? Camera "tối ưu" ở đây là loại camera có hỗ trợ chuản nén mjpeg, nghĩa là bản thân camera nó đã nén mjpeg rồi, bạn không cần "nén" lại một lần nữa (thường thì camera có chuẩn YUVU - dư liệu ảnh thô chưa nén => tốn kém hơn để nén => server load cao hơn). Mình khuyên các bạn nên mua camera logitech vì nó rẻ và dùng được. Nên mua cũ từ các bạn đã làm các đồ án trước, không nên mua mới vì giá rất chát rẻ nhất cũng đã hơn 400k rồi. Nhưng mua lại như hồi mình mua có 120k mà thôi, mà mới tinh tươm (xem chất lượng hình ảnh ở trên nha :D).

Sau khi đã gắn camera thành công vào cổng USB host (với gen 2 thì gắn vô là xong còn gen 1 cần phải có một dây USB OTG gắn vào cổng usb host nữa thì mới được, dây OTG chỉ có 10k một dây hay 5k gì đó thôi à).

Để kiểm tra Intel Galileo có nhận camera của bạn hay không thì các bạn chạy một trong các lệnh sau:

Nếu bạn thích chi tiết

... thì bạn chạy lệnh

dmesg

... nó sẽ hiện ra các thông tin về các log trên hệ thống, nếu nó có một dòng đại loại như thế này thì camera của bạn đã được nhận

[   12.096583] uvcvideo: Found UVC 1.00 device Webcam C170 (046d:082b)

[   12.151799] input: Webcam C170 as /devices/pci0000:00/0000:00:14.3/usb1/1-1/1-1:1.0/input/input2

[   12.190422] usbcore: registered new interface driver uvcvideo [   12.196299] USB Video Class driver (1.1.1)

Nếu các bạn thích đơn giản

... thì chạy lệnh 

ls /dev/video*

Nếu kết quả dạng như vầy thì Intel Galileo đã nhận camera

/dev/video0 (hoặc 1, 2,...)

Và đó cũng chính là tên device (device name) mà các bạn sẽ cần đến cho câu lệnh thực thi.

Câu lệnh thực thi

mjpg_streamer -i "/usr/bin/mjpg-streamer/input_uvc.so -d /dev/video0 -quality 100 -f 30 -r 640x480" -o "/usr/bin/mjpg-streamer/output_http.so -w /usr/bin/mjpg-streamer/www -p 8080"

-d <device name - chuỗi - mặc định /dev/video0>

-quality <chất lượng - số nguyên từ 1 - 100 - mặc định 75>

-f <frame per second - số nguyên từ 1 - 60 - mặc định 10>

-r <kích thước khung hình - chuỗi (xem hướng dẫn ở dưới)>

-p <port - số nguyên - từ 1 => 216 - 1>

Từ bây giờ, bạn có thể vào địa chỉ http://<địa chỉ IP của intel galileo>::8080 để xem hình ảnh truyền trực tiếp từ camera của bạn rồi đấy. 

Để biết được các kích thức khung bình của camera, bạn chạy lệnh sau:

v4l2-ctl --list-formats-ext --device /dev/video0

--device <device name - chuỗi - mặc định là /dev/video0

Để kiểm tra xem camera của bạn có hỗ trợ MJPG không thì chạy lệnh

v4l2-ctl --list-formats --device /dev/video0 | grep MJPEG

--device <device name - chuỗi - mặc định là /dev/video0

Nếu kết quả hiện ra là thì camera của bạn đã hỗ trợ mjpeg heart

       Name        : MJPEG

6. Lỗi có thể có

Với câu lệnh mjpg... được nêu ra ở trên và một camera không hỗ trợ mjpeg thì hình ảnh stream của bạn sẽ là một màu xám xịt hoặc sẽ rất chậm. Vì vậy, các bạn hãy chạy câu lệnh dưới đây (có thêm tham số -y để báo với mjpg-streamer là bạn đang yêu cầu stream với dữ liệu thô YUVU)

 mjpg_streamer -i "/usr/bin/mjpg-streamer/input_uvc.so -d /dev/video0 -quality 80 -f 5 -r 320x240 -y" -o "/usr/bin/mjpg-streamer/output_http.so -w /usr/bin/mjpg-streamer/www -p 8080"

IV. Lời kết

Đây là một phần nhỏ trong dự án kLaserCutter và mình đã chia sẻ miễn phí nó trong kLaserCutter. Tuy nhiên, mình thấy nó rất cần thiết với Cộng đồng, vì vậy nên mình quyết định viết bài này để hướng dẫn các bạn có thể dùng được camera một cách nhanh nhất có thể. Khi dùng nó, các bạn nhớ có một dòng trong tài liệu hướng dẫn về bài viết này nhé devil.

Chúc các bạn thành công

lên
3 thành viên đã đánh giá bài viết này hữu ích.
Chuyên mục: 
Các dự án được truyền cảm hứng

Select any filter and click on Apply to see results

Các bài viết cùng tác giả

Kết nối điều khiển từ xa sử dụng ESP8266 và Arduino với hệ thống firmware iNut Cảm biến CloudMQTT - 1000 firmware miễn phí

Chuyện kể rằng, có 02 sinh viên Việt Nam, trong lúc làm đồ án đại học kết nối điều khiển từ xa qua Internet. Một người thì chọn phương án truyền thống sử dụng máy tính làm máy chủ và demo các tính năng theo yêu cầu đồ án. Người còn lại biết đến iNut Sensor và tìm cách tối ưu hóa phần mềm và phần cứng nhằm chau chuốt cho đồ án của mình trở nên "xịn" và "nhiều tính năng bá đạo". Đến lúc bảo vệ đồ án, cậu sinh viên 01 cảm thấy choáng ván với muôn vàn vấn đề từ việc nơi trình bày đồ án không có wifi, mạng chập chờn, máy tính mở không lên, đứt cáp biển,... Cuối cùng cũng bảo vệ được với điểm số không ưng ý lắm dù tốn rất nhiều thời gian và công sức. Cậu còn lại nhờ vào việc chau chuốt phần mềm, tối ưu hóa và comment kĩ từng lệnh trong dòng code, viết báo cáo bài bản chuẩn bị slide như ý, dùng điện thoại cài wifi, quét mã QRcode để chia sẻ quyền truy cập đến phần mềm rất chuyên nghiệp, mọi thứ cậu chủ động hoàn toàn mà không bị các vấn đề "học tài thi phận" bủa vây mà kết quả hết sức mĩ mãn, điểm số mĩ miều, kiến thức IoT được chuẩn hóa. Thực vậy, các dự án, đồ án sử dụng nền tảng iNut Platform bên dưới cho phép các bạn sinh viên làm các dự án hết sức hoàn hảo: từ xe điều khiển, bãi giữ xe thông minh, hệ thống máy lạnh, máy bơm, điều hòa thông minh,... do chinh các bạn tự làm nên đã đạt được những điểm số tốt và tuyệt đối. Cũng chính vì thế, iNut JSC (công ty chủ quản của iNut Platform) đã kết hợp với Khu Công nghệ phần mềm - ĐHQGHCM để tổ chức những khóa đào tạo ngắn hạn cho sinh viên Việt Nam sử dụng nền tảng IoT do iNut JSC phát triển. Và để mở con đường tri thức tiếp cận IoT trong nháy mắt, iNut JSC đã tạo ra một phiên bản firmware trị giá 50.000 đồng sử dụng clouding của CloudMQTT và tài trợ 1000 firmware cho tất cả các bạn học sinh, sinh viên Việt Nam có thể tiếp cận IoT một cách dễ dàng và nhanh chóng nhất!

lên
14 thành viên đã đánh giá bài viết này hữu ích.

Làm thế nào để một nhóm lập trình viên có thể làm việc cùng nhau hiệu quả?

Nhắc lại đến việc sáng tạo ra một sản phẩm mới, chắc hẳn bạn luôn muốn nó ra đời và có hiệu quả trong thực tiễn. Tuy nhiên, không phải sản phẩm nào mới ra đời cũng được mọi người chào đón một cách nồng nhiệt như iPhone. Gác lại đến vấn đề hiệu quả của sản phẩm, đó là chuyện khó. Trước tiên, ta phải giải quyết chuyện dễ, đó là kết hợp sức mạnh của nhiều người để tạo nên một đội ngũ mạnh mẽ trong việc lập trình. Bây giờ câu hỏi đặt ra cho bạn là? Bạn muốn trở thành một phần của một nhóm có cùng lý tưởng và tiến đến thành công, HAY tự bạn sẽ tìm đến thành công bởi một mình bạn?

lên
9 thành viên đã đánh giá bài viết này hữu ích.