Phát hiện đối tượng OpenCV – dựa trên đặc trưng ảnh

Đến ngày, tầm nhìn máy tính làm cho máy tính thông minh hơn. Nó có thể nhận ra bất kỳ đối tượng đơn giản như một chiếc xe, một tòa nhà, một chén, vv. Trong bài này, chúng tôi muốn giải thích làm thế nào để làm cho máy tính nhận ra một hộp. Nói chung, phát hiện đối tượng, chúng tôi có thể không sử dụng một phương pháp đơn giản như màu dựa trên hình dạng dựa, vv. Việc sử dụng dự án này giới thiệu dựa trên phương pháp để phát hiện đối tượng. Đặc biệt, chúng tôi sử dụng quy mô bất biến tính năng chuyển đổi (SIFT) phương pháp để phát hiện hộp. Trước khi thảo luận về phương pháp, chúng tôi hiển thị cho bạn một video trình diễn của các đối tượng phát hiện tự động. Phần tiếp theo là chuẩn bị phần cứng & phần mềm. Sau đó chúng tôi nói chuyện về việc thực hiện và giải thích các thuật toán, biên dịch và chạy mã. Trong tâm trí khác, bạn có thể có một cái nhìn cho các ứng dụng của đối tượng phát hiện cho robot. Bài viết được đóng bởi kết luận của chúng tôi.

Giới thiệu

Video giới thiệu cho các đối tượng phát hiện

https://youtu.be/9oGFVLSM-a0

Như bạn thấy trong đoạn video, các thuật toán có thể phát hiện hộp ngay cả khi chúng tôi di chuyển nó bất cứ nơi nào hoặc bất kỳ hướng nào. Đó là lợi thế của phương pháp SIFT. Trong video này, bạn có thể nhìn thấy bên trái – góc hình ảnh tham khảo xem xét các đối tượng. Trong phạm vi tầm nhìn máy tính, chúng ta gọi hình ảnh đào tạo. Mục tiêu của dự án này là để tìm đối tượng này trên các môi trường thực tế trên tầm nhìn của máy ảnh. Trên mỗi khung, khi các đối tượng (đào tạo hình ảnh) được thành lập, một hình chữ nhật sẽ được rút ra trên video tại các vị trí đối tượng.

Chuẩn bị phần cứng & phần mềm

  • 1 USB máy ảnh
  • 14,04 cho Ubuntu
  • OpenCV 2.4.11
  • Thư viện C++, thực hiện, vv

Thực hiện và giải thích

Phương pháp SIFT hoặc như SIFT sử dụng cho các đối tượng phù hợp thường được chia theo 3 bước quan trọng:

  • Key điểm phát hiện (đối với đào tạo hình ảnh và hình ảnh mà chúng ta cần phải tìm kiếm các đối tượng trên)
  • Mô tả khai thác (đối với đào tạo hình ảnh và hình ảnh mà chúng ta cần phải tìm kiếm các đối tượng trên)
  • Mô tả phù hợp

Các bước mô tả phù hợp giúp các thuật toán của chúng tôi để tìm các đối tượng. Sau khi mô tả 2 hình ảnh được chiết xuất, chúng tôi so sánh từng mô tả của đào tạo hình ảnh vào hình ảnh khác với tất cả các descriptor thực hình ảnh. Nếu 2 descriptor là như nhau (hoặc gần giống), chúng tôi xem xét đó là phù hợp với một cặp.
Trong mẫu này, chúng tôi sử dụng phương pháp SIFT chiết xuất các tính năng. Nhưng thông thường cho đối tượng phát hiện, bạn cũng có thể dùng phương pháp dựa trên nổi bật khác như lướt web, ngắn gọn, vv. Để hiểu thêm chi tiết về phương pháp này, bạn có thể tham khảo phương pháp SIFT trang chính thức: http://www.cs.ubc.ca/~lowe/keypoints/.
Để làm dự án này, chúng ta cần chuẩn bị một hình ảnh được gọi là đào tạo hình ảnh bằng cách chụp các đối tượng mà bạn muốn phát hiện (hình ảnh bên trái – góc trên video là một ví dụ). Các thuật toán sẽ tìm thấy các đối tượng này.

Phát hiện các điểm chính của hình ảnh đào tạo

    int minHessian = 400;
    SiftFeatureDetector detector (minHessian);
    STD::vector<KeyPoint> keypoints_object;</KeyPoint>
    Detector.detect (img_object, keypoints_object);

Đoạn mã trên sẽ giúp xác định một số phiên bản cần thiết và phát hiện các điểm quan trọng. Một điểm quan trọng là một tính năng, nó có chứa vị trí trên hình ảnh, quy mô, góc và mô tả. Nhưng sau khi mã này, chúng tôi có thể phát hiện chỉ có các vị trí, quy mô và góc. Cho trích mô tả, các phương pháp tiếp tục với các bước tiếp theo.

Trích xuất các mô tả hình ảnh đào tạo

    --Bước 2: tính toán mô tả (tính năng vector)
    SiftDescriptorExtractor vắt;
    Mat descriptors_object;
    Extractor.Compute (img_object, keypoints_object, descriptors_object);

Đến đây các thuật toán có thể giải nén tất cả các tính năng từ đào tạo hình ảnh. Với hình ảnh cho thấy các đối tượng trên (mỗi khung), chúng tôi làm như vậy. Mỗi khung video (dự án của chúng tôi, chúng tôi không sử dụng video, chúng tôi sử dụng các máy ảnh dòng), chúng tôi nhận được một hình ảnh, sử dụng nó cho hình ảnh phát hiện và áp dụng SIFT để phát hiện các điểm then chốt, trích xuất các tính năng trên hình ảnh đó. SIFT là một phương pháp lớn của ông David G. Lowe, chúng tôi không thể giải thích tại đây. Nhưng chúng tôi muốn nói với phương pháp này, các thuật toán phát hiện tất cả các điểm quan tâm (điểm chính). Một điểm quan trọng là một điểm mà không thay đổi khi hình ảnh được thu nhỏ, di chuyển, thay đổi kích thước, vv. Vì lý do đó, chương trình của chúng tôi luôn luôn phát hiện hộp khi chúng tôi di chuyển nó bất cứ nơi nào trong bất kỳ hướng nào.
Được rồi, tất cả các điểm quan trọng được chiết xuất, bây giờ chúng tôi xem xét làm thế nào các thuật toán tìm các đối tượng trên từng khung hình ảnh của máy ảnh của chúng tôi.

Phù hợp với mô tả vectơ

	FlannBasedMatcher khớp;
	STD::vector< dmatch=""> </> phù hợp;
	Matcher.Match (descriptors_object, descriptors_scene, kết quả phù hợp);

Đoạn mã trên là phù hợp với điểm chính của 2 hình ảnh. Các yếu tố chính của điểm mấu chốt cho phù hợp với mô tả, chúng tôi không sử dụng các yếu tố khác. Mỗi mô tả SIFT chứa yếu tố 128 (bạn cần đọc các bài viết của tiến sĩ D.Lowe cho chi tiết). Bạn có thể sử dụng bất kỳ phương pháp cho phù hợp với bước. Nhưng OpenCV cung cấp 2 phương pháp thú vị: Brute-Force khớp và khớp FLANN. Mỗi phương pháp có tự lợi thế và bất lợi. Chúng tôi đề nghị bạn để readit để hiểu và lựa chọn phương pháp tuyệt vời cho http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_matcher/py_matcher.html trường hợp của bạn. Trong dự án này, chúng tôi sử dụng khớp FLANN.

Bộ lọc phù hợp với

Ngoài 3 bước ở trên, chúng tôi có thể thêm một số bước tùy chọn. Trong dự án này, chúng tôi thêm các bộ lọc bước phù hợp với cặp. Bước này sẽ giúp chúng tôi bỏ qua các kết hợp sai. Đặc biệt, chúng tôi sử dụng các thuật toán RANSAC. Đừng lo lắng, mà thuật toán cũng được thực hiện trong OpenCV. Nếu bạn muốn một cái gì đó đơn giản, bạn có thể sử dụng phương pháp khác để lọc các cặp kết hợp chẳng hạn như khoảng cách ngắn nhất. Chúng tôi đã sử dụng nó và kết quả không phải là xấu như vậy. Tuy nhiên, chúng tôi sử dụng các thuật toán RANSAC vì lợi thế của mình: https://en.wikipedia.org/wiki/Random_sample_consensus

FindhomoGraphy giúp tìm phép biến đổi giữa phù hợp các điểm quan trọng được gọi là ma trận afin.

	Mat H = findHomography (obj, cảnh, CV_RANSAC);

Dựa trên ma trận afin và 4 góc của đối tượng, chúng tôi có thể tính toán vị trí của mỗi góc vào khung hình bằng cách biến đổi Affine. Nhưng đối với đơn giản, OpenCV cung cấp cho chúng tôi một chức năng được đặt tên perspectiveTransform giúp tính toán các đối tượng được ánh xạ trong cảnh (để lập bản đồ các điểm).

	perspectiveTransform (obj_corners, scene_corners, H);

	-Vẽ các đường giữa các góc (các đối tượng được ánh xạ trong cảnh - image_2)
	dòng (img_matches, scene_corner[0]s + Point2f (img_object.cols, 0), scene_corn[1]ers + Point2f (img_object.cols, 0), vô (0, 255, 0), 4);
	dòng (img_matches, scene_corne[1]rs + Point2f (img_object.cols, 0), scene_corn[2]ers + Point2f (img_object.cols, 0), vô (0, 255, 0), 4);
	dòng (img_matches, scene_corne[2]rs + Point2f (img_object.cols, 0), scene_corn[3]ers + Point2f (img_object.cols, 0), vô (0, 255, 0), 4);
	dòng (img_matches, scene_corne[3]rs + Point2f (img_object.cols, 0), scene_corn[0]ers + Point2f (img_object.cols, 0), vô (0, 255, 0), 4);

Khi bốn góc của đối tượng được thành lập vào khung hình, chúng ta vẽ một hình chữ nhật cho kết nối 4 góc. Phần bên trong hình chữ nhật là đối tượng mà chúng tôi muốn phát hiện. Vị trí của các đối tượng là trung tâm của hình chữ nhật.

Sử dụng mã

Cho dễ dàng hơn để bắt đầu dự án của bạn, bạn có thể xem mã nguồn của chúng tôi lần đầu tiên. Sau đó, bạn có thể tạo mã riêng của bạn hoặc sửa đổi chúng ta.
Kiểm tra chúng tôi Github
git clone https://github.com/Booppey/object_detection.git
Sau đó mở thiết bị đầu cuối của bạn, điều hướng đến thư mục các dự án và các loại:

     g ++ -o object_detection object_detection.cpp-L/home/user_name/opencv-2.4.11/build/install/lib-lopencv_core-lopencv_imgproc-lopencv_highgui-lopencv_features2d-lopencv_flann-lopencv_nonfree-lopencv_calib3d
     . / object_detection

Đó là lệnh tôi sử dụng trong trường hợp của tôi. Có lẽ bạn cần phải thay đổi một cái gì đó để chạy trong trường hợp của bạn. Nếu bạn có bất kỳ khó khăn hay vấn đề, không được nhút nhát để cho chúng tôi biết bằng cách để lại một bình luận.

Các ứng dụng khác của phát hiện đối tượng

Video ứng dụng mô-đun này cho Parrot Bebop Drone đối tượng theo dõi:

Trong video này, Parrot Bebop drone sau vào hộp cho đến khi hộp nằm ở trung tâm của drone của máy ảnh. Mục tiêu giả này có thể biến, đi lên, xuống, chuyển tiếp và lạc hậu. Khi đối tượng hộp ra khỏi màn hình camera, drone sẽ quay lại để lấy hộp.
Đối với ứng dụng này, chúng tôi sử dụng các thuật toán mà chúng tôi giải thích như trên, nhưng chúng tôi thay đổi kiến trúc. Chúng tôi sử dụng client – server kiến trúc. Xử lý các thuật toán phần ảnh chạy về phía máy chủ. Điện thoại android và robot cung cấp phía khách hàng.
Ngoài 2 ứng dụng như trên, bạn có thể xem các ứng dụng khác của chúng tôi tại
https://youtu.be/Wb1P36c3G6s

https://youtu.be/27UeRg_-IbI

Kết luận

Tính năng dựa trên cách tiếp cận như SIFT, lướt web… Đang thường được coi là trong trường hợp hình ảnh đào tạo có tính năng mạnh mẽ. Phương pháp tiếp cận có thể cũng hữu ích hơn nữa nếu trận đấu trong tìm kiếm hình ảnh có thể được biến đổi trong một số thời trang. Trong trường hợp các hình ảnh đào tạo mà không có tính năng mạnh mẽ, chúng tôi có thể áp dụng cách tiếp cận khác như: màu sắc dựa cho hình ảnh với màu sắc đơn giản, dựa trên mẫu có thể được hiệu quả với hình ảnh mà không thay đổi kích thước, vv.

Share This:

Trả lời

Thư điện tử của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *