Chọn công cụ Machine Vision: Halcon, VisionPro, OpenCV hay smart camera
So sánh thư viện thương mại và mã nguồn mở, khi nào dùng smart camera, tính chi phí theo số trạm và các bẫy bản quyền.
Học xong bài này, bạn sẽ
- So sánh thư viện thương mại và mã nguồn mở
- Hiểu smart camera và khi nào dùng
- Chọn công cụ theo dự án và ngân sách
Nên học trước: 5 nhóm bài toán Machine Vision và cách giải
Nội dung bài viết
Đến đây bạn đã biết một trạm Machine Vision gồm những khối nào (bài 1) và yêu cầu của khách hàng thuộc nhóm bài toán nào (bài 2). Câu hỏi tiếp theo, thường được hỏi ngay trong buổi họp đầu tiên: làm bằng gì? Thư viện thương mại như HALCON, VisionPro; thư viện mã nguồn mở như OpenCV mà bạn đã học ở Giai đoạn 1; hay một smart camera cấu hình bằng chuột? Không có câu trả lời đúng cho mọi dự án. Bài này cho bạn tiêu chí để chọn, cách tính chi phí theo số trạm, và những điều cần biết về bản quyền để không gặp rắc rối khi giao hệ thống cho khách hàng.
1. Bốn lựa chọn chính
| Lựa chọn | Ví dụ | Cách làm việc |
|---|---|---|
| Thư viện thương mại | MVTec HALCON, Cognex VisionPro, Matrox Imaging Library (MIL) | Viết chương trình (C++, C#/.NET, một số có Python) gọi các hàm/công cụ đã được tối ưu; thường kèm môi trường thử nghiệm tương tác (ví dụ HDevelop của HALCON) |
| Phần mềm cấu hình trên PC | Các phần mềm kéo thả của hãng thư viện hoặc hãng camera | Ghép các công cụ thành luồng xử lý bằng giao diện, ít hoặc không viết code |
| Smart camera / vision sensor | Cognex (dòng In-Sight), Keyence, Omron, SICK, Teledyne DALSA… | Camera có bộ xử lý và phần mềm bên trong, cấu hình qua máy tính, chạy độc lập, nối thẳng PLC |
| Mã nguồn mở | OpenCV, scikit-image, NumPy; PyTorch, ONNX Runtime, OpenVINO cho AI; Tesseract, zxing-cpp cho đọc chữ, đọc mã | Tự ghép thuật toán, tự viết giao diện, I/O, lưu trữ; toàn quyền kiểm soát |
Dù chọn gì, việc lấy ảnh từ camera công nghiệp đi qua SDK của hãng camera (ví dụ pylon của Basler, có gói Python pypylon; Spinnaker của Teledyne FLIR; MVS của Hikrobot) hoặc qua chuẩn chung GenICam (thư viện Python harvesters, thư viện Aravis trên Linux). Thư viện thương mại thường tích hợp sẵn việc lấy ảnh từ camera chuẩn GigE Vision, USB3 Vision; với OpenCV bạn tự viết lớp lấy ảnh từ SDK. cv2.VideoCapture bạn dùng với webcam ở Giai đoạn 1 không phải cách điều khiển camera công nghiệp (trigger, exposure, gain) trong trạm thật.
2. Thư viện thương mại so với mã nguồn mở
| Tiêu chí | Thư viện thương mại (HALCON, VisionPro, MIL…) | Mã nguồn mở (OpenCV + hệ sinh thái Python/C++) |
|---|---|---|
| Chi phí bản quyền | Bản quyền phát triển (cho máy kỹ sư) + bản quyền runtime cho mỗi máy chạy; module nâng cao (3D, deep learning) có thể tính riêng | Miễn phí với giấy phép dễ dãi (OpenCV dùng Apache 2.0 từ bản 4.5); vẫn phải kiểm tra giấy phép từng thư viện kèm theo |
| Công cụ "khó" có sẵn | Khớp mẫu hình dạng bất biến xoay/tỉ lệ có subpixel, công cụ đo cạnh, hiệu chuẩn, đọc mã 2D khó (khắc laser, in chấm), OCR công nghiệp, 3D, deep learning: đã tối ưu, đã được kiểm chứng ở rất nhiều nhà máy | Có nhiều khối cơ bản tốt (lọc, hình thái học, contour, hiệu chuẩn camera, khớp mẫu đơn giản, đọc QR); các công cụ "công nghiệp" như khớp hình dạng xoay tự do có subpixel thường phải tự xây hoặc ghép thêm |
| Tốc độ phát triển | Nhanh với bài khó: thử công cụ trên ảnh thật trong IDE tương tác trong vài giờ | Nhanh với bài đơn giản; chậm và rủi ro với bài khó vì phải tự viết, tự kiểm chứng |
| Hỗ trợ | Hỗ trợ kỹ thuật của hãng và nhà phân phối, tài liệu đầy đủ, có cam kết vòng đời sản phẩm | Cộng đồng, tài liệu mở, mã nguồn để tự đọc; không có ai chịu trách nhiệm thay bạn |
| Phụ thuộc | Phụ thuộc hãng: đổi phiên bản, đổi chính sách bản quyền, khóa bản quyền (dongle USB) bị mất hoặc hỏng làm trạm ngừng | Không khóa; nhưng phụ thuộc năng lực đội ngũ của bạn để bảo trì code |
| Tùy biến | Cao trong phạm vi API; thuật toán bên trong là hộp đen | Toàn quyền, kể cả sửa thuật toán, chạy trên máy nhúng, tích hợp AI tùy ý |
| Khách hàng nhìn nhận | Nhiều nhà máy (nhất là FDI) có danh sách thiết bị/phần mềm chuẩn, đôi khi bắt buộc một hãng cụ thể | Cần chứng minh độ tin cậy bằng kết quả nghiệm thu, tài liệu, bảo hành của chính bạn |
Một cách nhìn thực tế: thư viện thương mại là mua thời gian và giảm rủi ro cho phần thuật toán khó; mã nguồn mở là đổi công kỹ sư lấy chi phí bản quyền và sự tự chủ. Nhiều công ty tích hợp hệ thống ở Việt Nam dùng cả hai: OpenCV/Python để thử nghiệm nhanh và cho bài đơn giản, thư viện thương mại cho bài đo chính xác hoặc định vị khó, smart camera cho trạm nhỏ, lặp lại nhiều.
3. Smart camera: khi nào là lựa chọn tốt nhất?
Smart camera là camera công nghiệp tích hợp bộ xử lý, bộ nhớ, phần mềm vision và cổng I/O. Bạn cấu hình trên PC (chọn công cụ, vẽ ROI, đặt ngưỡng), tải chương trình xuống camera, rồi rút PC ra: camera tự nhận trigger, xử lý và xuất OK/NG cho PLC. Vision sensor là dạng đơn giản hơn nữa, thường chỉ có vài công cụ (có/không, đếm, đọc mã) và cấu hình rất nhanh.
| Ưu điểm | Nhược điểm |
|---|---|
|
|
Nên dùng smart camera khi: bài toán thuộc nhóm có/không, đọc mã, đo đơn giản, định vị cơ bản; một hoặc hai điểm nhìn; nhiều trạm giống nhau; đội bảo trì của nhà máy không lập trình; khách hàng đã chuẩn hóa một hãng. Nên dùng PC + camera rời khi: nhiều camera, thuật toán đặc biệt hoặc AI nặng, cần lưu và phân tích nhiều dữ liệu, cần giao diện riêng, hoặc thời gian xử lý trên smart camera không đạt.
4. Bảng quyết định nhanh
| Tình huống dự án | Gợi ý | Lý do |
|---|---|---|
| 1 trạm kiểm tra có nắp, có nhãn, đọc mã vạch; nhà máy muốn tự bảo trì | Smart camera hoặc vision sensor | Bài dễ, cần nhanh và dễ thay thế |
| Đo 15 kích thước trên chi tiết cơ khí, dung sai ± 0,01 mm, 2 camera | PC + thư viện thương mại (hoặc OpenCV nếu đội rất mạnh về đo lường) | Cần đo subpixel, hiệu chuẩn, fitting đã kiểm chứng |
| Robot gắp chi tiết xoay tự do trên băng tải | PC + thư viện có khớp mẫu hình dạng mạnh; hoặc smart camera dòng cao cấp nếu đủ nhanh | Khớp mẫu bất biến xoay ổn định là phần khó nhất |
| Kiểm lỗi bề mặt đa dạng, hình dạng lỗi khó mô tả bằng luật | PC có GPU + deep learning (mã nguồn mở hoặc công cụ DL thương mại) | Luật cổ điển khó bao phủ biến thể lỗi |
| Sản phẩm thương mại của công ty bạn, bán 100+ trạm giống nhau | OpenCV/mã nguồn mở, có thể trên máy nhúng | Bản quyền runtime nhân theo số trạm; công phát triển chia đều cho nhiều trạm |
| Thử nghiệm khả thi trong 2 tuần trước khi báo giá | Python + OpenCV, kết hợp bản dùng thử của thư viện thương mại | Nhanh, rẻ; sau đó chọn công cụ sản xuất dựa trên kết quả |
5. Tính chi phí theo số trạm
Chi phí thật không chỉ là giá bản quyền. Gồm: phí một lần (bản quyền phát triển), chi phí mỗi trạm (phần cứng, bản quyền runtime), giờ kỹ sư phát triển, và giờ bảo trì nhiều năm. Mô hình sau dùng số liệu giả định để minh họa phương pháp; khi làm thật, thay bằng báo giá bạn nhận được và ước lượng giờ công của đội bạn.
# Mô hình tổng chi phí 3 năm (TCO) theo số trạm giống nhau.
# ĐƠN VỊ GIẢ ĐỊNH để minh họa phương pháp, không phải giá thật: hãy thay bằng báo giá bạn nhận được.
GIO_CONG = 0.2 # chi phí 1 giờ kỹ sư (đơn vị)
SO_NAM = 3
def tco(p, so_tram):
if p is None: # phương án không đáp ứng được bài toán này
return None
return (p["mot_lan"] + p["gio_dev"] * GIO_CONG
+ so_tram * (p["moi_tram"] + p["gio_bt"] * GIO_CONG * SO_NAM))
def in_bang(ten, phuong_an):
print(f"== {ten}")
print("Số trạm | " + " | ".join(f"{k:>12s}" for k in phuong_an))
for n in (1, 3, 10, 30):
gia = {k: tco(p, n) for k, p in phuong_an.items()}
kha_thi = {k: v for k, v in gia.items() if v is not None}
re_nhat = min(kha_thi, key=kha_thi.get)
o = " | ".join(f"{'không đạt':>12s}" if v is None else f"{v:12.0f}" for v in gia.values())
print(f"{n:7d} | {o} ← rẻ nhất: {re_nhat}")
# mot_lan: bản quyền phát triển; moi_tram: phần cứng + bản quyền runtime; gio_dev: giờ phát triển;
# gio_bt: giờ bảo trì mỗi trạm mỗi năm
in_bang("Bài toán đơn giản: có/không + đọc mã", {
"Thư viện TM": {"mot_lan": 40, "moi_tram": 18 + 15, "gio_dev": 120, "gio_bt": 4},
"OpenCV": {"mot_lan": 0, "moi_tram": 18, "gio_dev": 200, "gio_bt": 6},
"Smart camera": {"mot_lan": 0, "moi_tram": 30, "gio_dev": 40, "gio_bt": 2},
})
in_bang("Bài toán khó: định vị chi tiết xoay tự do + đo subpixel ± 0,01 mm", {
"Thư viện TM": {"mot_lan": 40, "moi_tram": 18 + 15, "gio_dev": 300, "gio_bt": 6},
"OpenCV": {"mot_lan": 0, "moi_tram": 18, "gio_dev": 1400, "gio_bt": 16},
"Smart camera": None,
})
== Bài toán đơn giản: có/không + đọc mã
Số trạm | Thư viện TM | OpenCV | Smart camera
1 | 99 | 62 | 39 ← rẻ nhất: Smart camera
3 | 170 | 105 | 102 ← rẻ nhất: Smart camera
10 | 418 | 256 | 320 ← rẻ nhất: OpenCV
30 | 1126 | 688 | 944 ← rẻ nhất: OpenCV
== Bài toán khó: định vị chi tiết xoay tự do + đo subpixel ± 0,01 mm
Số trạm | Thư viện TM | OpenCV | Smart camera
1 | 137 | 308 | không đạt ← rẻ nhất: Thư viện TM
3 | 210 | 363 | không đạt ← rẻ nhất: Thư viện TM
10 | 466 | 556 | không đạt ← rẻ nhất: Thư viện TM
30 | 1198 | 1108 | không đạt ← rẻ nhất: OpenCV
Hai bài học rút ra từ mô hình (với số liệu giả định này):
- Bài toán đơn giản, ít trạm: smart camera rẻ nhất vì gần như không tốn công phát triển. Khi số trạm tăng, chi phí phần cứng mỗi trạm chiếm ưu thế và OpenCV trên phần cứng rẻ hơn thắng.
- Bài toán khó: thư viện thương mại rẻ nhất cho tới khoảng 20 trạm, vì 1400 giờ tự xây công cụ khớp mẫu và đo subpixel là rất đắt (và rủi ro không thể hiện trong bảng: có thể làm mãi không đạt độ ổn định). Chỉ khi nhân bản rất nhiều trạm, mã nguồn mở mới bù lại.
6. Ma trận quyết định có trọng số
Chi phí không phải tiêu chí duy nhất. Cách làm phổ biến: (1) loại trước các phương án không đạt tiêu chí bắt buộc (không đủ nhanh, không đọc được mã, khách hàng không cho phép); (2) chấm điểm các phương án còn lại theo tiêu chí có trọng số phù hợp dự án.
# Ma trận quyết định có trọng số cho dự án: 3 trạm kiểm tra nhãn + đọc mã, đội bảo trì không lập trình.
# Trọng số theo DỰ ÁN, điểm 1–5 do nhóm bạn đánh giá sau khi thử với mẫu thật.
TIEU_CHI = { # tiêu chí: trọng số (tổng = 100)
"Đáp ứng thuật toán": 30,
"Thời gian triển khai": 20,
"Chi phí 3 năm": 20,
"Kỹ năng đội bảo trì": 15,
"Mở rộng, tùy biến": 15,
}
DIEM = { # cùng thứ tự tiêu chí ở trên
"Thư viện TM": [5, 4, 2, 3, 4],
"OpenCV": [3, 2, 4, 2, 5],
"Smart camera": [4, 5, 4, 5, 2],
}
trong_so = list(TIEU_CHI.values())
ket_qua = {k: sum(w * d for w, d in zip(trong_so, ds)) / 100 for k, ds in DIEM.items()}
for ten, diem in sorted(ket_qua.items(), key=lambda kv: -kv[1]):
print(f"{ten:13s} {diem:.2f} / 5")
Smart camera 4.05 / 5
Thư viện TM 3.75 / 5
OpenCV 3.15 / 5
Với dự án nhiều trạm giống nhau, đội bảo trì không lập trình, smart camera dẫn đầu. Đổi trọng số (ví dụ dự án nghiên cứu, cần tùy biến cao, "Mở rộng, tùy biến" = 35) thì thứ hạng đổi. Giá trị của ma trận không nằm ở con số cuối, mà ở chỗ buộc cả nhóm nói rõ điều gì quan trọng trước khi chọn, và để lại lý do bằng văn bản cho khách hàng.
7. Bản quyền: những điều phải kiểm tra
- Runtime license cho mọi máy chạy, kể cả PC dự phòng và máy chạy offline để phân tích ảnh. Hỏi rõ: bản quyền gắn dongle USB hay gắn phần cứng máy? Thay mainboard có phải kích hoạt lại không? Ai giữ bản quyền khi bàn giao: bạn hay khách hàng?
- Phiên bản: chương trình viết cho một phiên bản thư viện có thể cần bản quyền mới khi nâng cấp. Ghi rõ phiên bản trong tài liệu bàn giao.
- Module riêng: deep learning, 3D, OCR nâng cao có thể là bản quyền riêng. Hỏi nhà phân phối trước khi báo giá.
- Giấy phép mã nguồn mở: Apache 2.0, BSD, MIT là giấy phép dễ dãi, dùng thương mại được (giữ thông báo bản quyền). GPL, AGPL là giấy phép "copyleft": phân phối phần mềm có dùng chúng có thể buộc bạn công bố mã nguồn của mình. Ví dụ hay gặp: thư viện YOLO của Ultralytics dùng AGPL-3.0 (hoặc mua giấy phép thương mại); PyQt dùng GPL hoặc giấy phép thương mại, trong khi PySide dùng LGPL. Không chắc thì hỏi bộ phận pháp lý trước khi bàn giao.
- Mô hình AI huấn luyện sẵn có giấy phép riêng, có khi khác giấy phép của mã nguồn.
8. Sai lầm thường gặp
- Chọn theo thói quen ("công ty mình chỉ dùng X") mà không kiểm tra X có làm được bài này trong cycle time không.
- Đánh giá smart camera chỉ với một công cụ, rồi thêm 8 công cụ khi triển khai và vượt cycle time.
- Báo giá OpenCV "miễn phí" mà quên giờ công tự xây giao diện, lưu ảnh, giao tiếp PLC, nhật ký lỗi, quản lý công thức sản phẩm. Phần thuật toán thường chỉ là một phần nhỏ khối lượng code của trạm hoàn chỉnh.
- Không làm thử trên ảnh thật trước khi chốt công cụ. Hầu hết hãng và nhà phân phối có bản dùng thử hoặc hỗ trợ làm thử; hãy dùng.
9. Bài tập
Bài 1. Chọn công cụ và nêu hai lý do cho mỗi dự án: (a) nhà máy bánh kẹo cần 12 trạm giống nhau kiểm tra hạn sử dụng in trên gói, đội bảo trì là thợ điện; (b) công ty bạn phát triển máy kiểm tra ngoại quan để bán cho nhiều khách hàng; (c) kiểm tra 40 chân linh kiện bị cong, cần đo khoảng cách chân chính xác 0,02 mm, chỉ 1 máy.
Xem đáp án
- (a) Smart camera có OCR/OCV: nhiều trạm giống nhau, bảo trì không lập trình, bài toán thuộc nhóm nhận dạng cơ bản. Kiểm tra thời gian xử lý với tốc độ đóng gói thật.
- (b) Mã nguồn mở (OpenCV, có thể kèm AI): bản quyền runtime sẽ nhân theo mỗi máy bán ra; công ty có thời gian đầu tư phát triển và giữ toàn quyền sản phẩm. Nếu cần một công cụ khó, có thể mua riêng thư viện cho công cụ đó và tính vào giá máy.
- (c) PC + thư viện thương mại: đo chính xác cần công cụ đo cạnh, fitting, hiệu chuẩn đã kiểm chứng; chỉ 1 máy nên phí bản quyền nhỏ so với giờ công tự xây.
Bài 2. Trong mô hình chi phí ở mục 5, kịch bản "bài toán khó": tìm số trạm nhỏ nhất mà OpenCV rẻ hơn thư viện thương mại. Viết vòng lặp tìm điểm hòa vốn.
Xem đáp án
GIO_CONG, SO_NAM = 0.2, 3
tm = {"mot_lan": 40, "moi_tram": 33, "gio_dev": 300, "gio_bt": 6}
cv = {"mot_lan": 0, "moi_tram": 18, "gio_dev": 1400, "gio_bt": 16}
def tco(p, n):
return p["mot_lan"] + p["gio_dev"] * GIO_CONG + n * (p["moi_tram"] + p["gio_bt"] * GIO_CONG * SO_NAM)
n = 1
while tco(cv, n) >= tco(tm, n):
n += 1
print(f"OpenCV rẻ hơn từ {n} trạm: {tco(cv, n):.0f} so với {tco(tm, n):.0f}")
OpenCV rẻ hơn từ 21 trạm: 860 so với 869
Kiểm tra bằng tay: phần cố định của thư viện thương mại là 40 + 300 × 0,2 = 100, của OpenCV là 1400 × 0,2 = 280, chênh 180. Mỗi trạm thư viện thương mại tốn 33 + 6 × 0,2 × 3 = 36,6, OpenCV tốn 18 + 16 × 0,2 × 3 = 27,6, tức rẻ hơn 9. Hòa vốn khi 9n = 180, n = 20; từ trạm thứ 21 OpenCV rẻ hơn. Nhớ rằng con số này chưa tính rủi ro tự xây công cụ không đạt yêu cầu.
Bài 3. Đồng nghiệp dùng PyQt5 làm giao diện và một mô hình YOLO của Ultralytics để phát hiện lỗi, rồi đóng gói phần mềm bán kèm máy cho khách hàng. Bạn cần kiểm tra những gì về bản quyền?
Xem đáp án
- PyQt5 dùng GPL v3 hoặc giấy phép thương mại: phân phối phần mềm đóng gói kèm PyQt5 mà không công bố mã nguồn theo GPL thì cần mua giấy phép thương mại; hoặc chuyển sang PySide (LGPL, cần tuân thủ điều kiện LGPL như cho phép thay thư viện).
- Ultralytics YOLO dùng AGPL-3.0: dùng trong sản phẩm thương mại đóng mã thường cần giấy phép doanh nghiệp của Ultralytics. Xem điều khoản hiện hành trên trang chính thức.
- Trọng số mô hình huấn luyện sẵn và bộ dữ liệu dùng để huấn luyện cũng có giấy phép riêng.
- Lập danh sách tất cả thư viện kèm giấy phép (một bảng "bill of materials" phần mềm) đưa vào hồ sơ bàn giao.
Tóm tắt
- Bốn lựa chọn: thư viện thương mại, phần mềm cấu hình, smart camera/vision sensor, mã nguồn mở. Nhiều dự án kết hợp vài lựa chọn.
- Thư viện thương mại mua thời gian và giảm rủi ro cho thuật toán khó; mã nguồn mở đổi công kỹ sư lấy chi phí bản quyền và sự tự chủ.
- Smart camera hợp với bài toán vừa phải, ít điểm nhìn, nhiều trạm giống nhau, đội bảo trì không lập trình; luôn thử với cycle time thật.
- Tính tổng chi phí theo số trạm và số năm, không chỉ giá bản quyền; loại phương án không đạt tiêu chí bắt buộc rồi mới chấm điểm có trọng số.
- Kiểm tra bản quyền runtime, dongle, module riêng và giấy phép mã nguồn mở (đặc biệt GPL/AGPL) trước khi bàn giao.
Bài tiếp theo: Bài tập chặng 4: phân tích một yêu cầu kiểm tra, nơi bạn dùng cả ba bài của chặng để biến một email khách hàng thành đề xuất kỹ thuật.


