2011-11-15 61 views
11

Tôi xin lỗi nếu câu hỏi này đã được đề cập trên trang web này, nhưng dường như tôi không thể tìm thấy câu trả lời thẳng về phía trước. Tôi đang tạo một ứng dụng Android sử dụng OpenCV để chụp ảnh, xử lý ảnh để phát hiện các đối tượng và tìm ra tọa độ của các đối tượng đó trong cảnh.Tải hình ảnh bằng OpenCV trong Android

Tất cả các hướng dẫn tôi tìm cho android dường như là xử lý thời gian thực xem trước máy ảnh hoặc sử dụng C++, mà tôi rất muốn không phải đi xuống đường C++. Tôi chắc rằng tôi đang thiếu một cái gì đó đơn giản nhưng tôi không biết nó là gì.

Lưu ý khác, các đối tượng tôi đang cố gắng phát hiện là bi-a trên bàn. Điều gì sẽ là kỹ thuật tiền xử lý tốt nhất để phát hiện tốt hơn các quả bóng? Tôi đã làm một bài kiểm tra nhanh chóng bằng cách sử dụng phương pháp canny, và có vẻ như là ánh sáng phản chiếu những quả bóng phá vỡ hình tròn.

+1

Hãy thử nhìn vào HoughCircles – Adrian

Trả lời

16

Để tải hình ảnh trong Android, bạn có thể sử dụng

Bitmap bMap=BitmapFactory.decodeResource(getResources(),R.drawable.image1) 

nơi image1 là một hình ảnh trong thư mục Tài nguyên của dự án Android của bạn. Sau đó chuyển đổi Bitmap thành byte hoặc Mat và xử lý trong C++ (OpenCV) hoặc Java bằng phương thức matToBitmap hoặc MatToBitmap trong android-opencv.

Nếu bạn cảm thấy thoải mái trong chế biến sử dụng kiểu dữ liệu Mat, bạn có thể sử dụng (bạn cần android-opencv dự án sử dụng này)

Mat m = Highgui.imread("/media/path_to_image"); 

Bạn có thể sử dụng các đốm màu, hình tròn hough để phát hiện những quả bóng bi-a. Không có cách nào để trả lời câu hỏi này. Bạn có thể thử sử dụng các vùng màu RGB hoặc Lab chuẩn hóa để chơi xung quanh (để loại bỏ sự phản chiếu của các quả bi-a) để xem bạn có phát hiện các quả bóng bi-a (bằng cách chạy vòng tròn hough, dò đốm).

Kịch bản thời gian thực sẽ yêu cầu bạn sử dụng các kỹ thuật học máy để phát hiện bi-a bằng cách sử dụng các vectơ đặc trưng nhất định, sau đó thực hiện đào tạo và thử nghiệm.

+0

Cảm ơn bạn, tôi đã có thể hình dung nó ra, nhưng tôi cũng phát hiện ra về javacv mà vẫn đúng hơn với mã opencv bản địa, do đó làm cho nó dễ dàng hơn để làm theo cùng với các hướng dẫn khác. – vince88

+0

@ vince88 nơi bạn tìm thấy hướng dẫn javacv? Và bạn có thể cho tôi biết cách thiết lập nó trên cửa sổ không? Cảm ơn. –

+0

Ngoài ra sau khi khai báo kiểu dữ liệu Mat, tôi phải làm gì để hiển thị nó? –

2

Tôi biết đã quá muộn nhưng ai đó có thể sử dụng quyền này.

Highgui đã bị xóa khỏi opencv cho android.

Thay vào đó, bạn có thể sử dụng mã Imgcodes.

Mat BGRMat = Imgcodecs.imread(getResources().getDrawable(R.drawable.img).toString()); 
+0

không quá muộn, đã giúp tôi! getDrawable không được chấp nhận để bạn có thể sử dụng: Mat BGRMat = Imgcodecs.imread (ResourcesCompat.getDrawable (getResources(), R.drawable.img, null) .toString()); – syonip

+1

thực sự tôi không thể thực hiện công việc này, bởi vì một tài nguyên có thể vẽ được không có đường dẫn imread có thể sử dụng. toString() chỉ trả về tên của tài nguyên ... – syonip

+0

@syonip Tôi thấy mã của bạn ở trên và có một số lỗi :) Hãy đảm bảo sao chép mã chính xác. Ví dụ sau phương thức getResources(), bạn nên đặt. (Dấu chấm) thay vì, (dấu phẩy). Chúc may mắn... –

5

này làm việc cho tôi (có câu trả lời từ đây: How to get Mat with a drawable input in Android using OpenCV)

Mat img = null; 
try { 
    img = Utils.loadResource(this, R.drawable.image_id, CvType.CV_8UC4); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
+0

Xin chào, tôi đã sử dụng mã này để tải hình ảnh RGB, nhưng đối với một số tiếng vang, loại 'Mat' là' CV_8UC1'. bất kỳ ý tưởng tại sao là điều đó? – noamgot

Các vấn đề liên quan