2011-11-15 102 views
11

如果此问题已在本网站上发布,我很抱歉,但似乎无法找到简单明了的答案。我正在制作一个使用OpenCV拍摄照片的Android应用程序,处理它以检测对象,并找出场景中这些对象的坐标。在Android中使用OpenCV加载图像

我发现的所有教程似乎都是实时处理相机预览或使用C++,我宁愿不必沿着C++路线走。我确定我错过了一些简单的东西,但我不知道它是什么。

另一方面,我试图检测的对象是桌上的台球。什么是最好的预处理技术来更好地检测球?我使用canny方法做了一个快速测试,看起来球的反射光破坏了圆形。

+1

试着看HoughCircles – Adrian

回答

16

载入图像在Android中,你可以使用

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

image1的地方是在你的Android项目的资源文件夹中的图像。 然后将位图转换为字节或Mat,并用android-opencv中的matToBitmap或MatToBitmap方法在C++(OpenCV)或Java中进行处理。

如果您在使用垫的数据类型,可以使用在处理舒适(你需要android-opencv项目使用此)

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

您可以使用斑点,霍夫圆检测台球。没有什么方法可以回答这个问题。您可以尝试使用标准化的RGB或Lab颜色空间来玩耍(去除台球的反射),以查看您是否检测到台球(通过运行ough circle,blob检测器)。

实时场景将要求您使用机器学习技术通过使用某些特征向量来检测台球,然后进行训练和测试。

+0

谢谢你,我能弄清楚,但我也发现了javacv哪些保持更加真实的本地opencv代码,从而更容易跟随其他教程。 – vince88

+0

@ vince88你在哪里找到javacv教程?你还可以告诉我如何在Windows上设置它吗?谢谢。 –

+0

在声明Mat数据类型之后,还需要做些什么才能显示它? –

2

我知道这太晚了,但有人可能会使用它。

Highgui已从android的opencv中删除。

您可以改为使用Imgcodes。

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

不算太晚,帮帮我! getDrawable已弃用,因此您可以使用:Mat BGRMat = Imgcodecs.imread(ResourcesCompat.getDrawable(getResources(),R.drawable.img,null).toString()); – syonip

+1

实际上我无法完成这项工作,因为可绘制资源没有imread可以使用的路径。 toString()只是返回资源的名称... – syonip

+0

@syonip我看到你的代码上面,并且有一些错误:)请确保正确地复制代码。例如,在getResources()方法之后,您应该放置。(点)而不是(逗号)。祝你好运... –

5

这对我的作品(得到了这里的答案: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

你好,我用这个代码来加载一个RGB图像,但是对于一些共振,'Mat'类型是'CV_8UC1'。任何想法是为什么? – noamgot