2015-06-18 206 views
0

我正在寻找Android应用程序的简单例子,它使用opencv将彩色图像转换为灰度。 我正在尝试使用thic代码,但是应用程序在此行后出现故障Mat tmp = new Mat(bmp.getWidth(), bmp.getHeight(), CvType.CV_8U); Android与opencv - 图像灰度

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    ImageView img=(ImageView)findViewById(R.id.imageView1); 

    Bitmap bmp = BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher); 

    Mat tmp = new Mat(bmp.getWidth(), bmp.getHeight(), CvType.CV_8U); 

    Utils.bitmapToMat(bmp, tmp); 

    Imgproc.cvtColor(tmp, tmp, Imgproc.COLOR_RGB2GRAY); 
    Imgproc.cvtColor(tmp, tmp, Imgproc.COLOR_RGB2GRAY,4); 

    Utils.matToBitmap(tmp, bmp); 
    img.setImageBitmap(bmp); 
} 
+0

我假设发生这种情况是因为bmp.getWidth()和bmp.getHeight()都返回0.我到目前为止还没有使用OpenCV,所以我不确定这是否是真正的原因。不过,您可以尝试在其中加入一些硬编码值来测试它是否会产生任何影响。 – helleye

回答

0

真正快速的方式来做到这一点。没有opencv。

private Button button; 
private ImageView image; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    button = (Button)findViewById(R.id.button1); 
    image = (ImageView)findViewById(R.id.imageView1); 


    button.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      ColorMatrix matrix = new ColorMatrix(); 
      matrix.setSaturation(0); 

      ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix); 
      image.setColorFilter(filter); 


     } 
    }); 

我刚试过,对我有用。

编辑:查看这里的链接官方文档。 http://developer.android.com/reference/android/graphics/ColorMatrix.html#setSaturation(float)

0

您的布局尚未制定出来呢,当你在onCreate(),这就是为什么bmp.getWidth()bmp.getHeight()返回0
一种方式做到这一点是重写onWindowFocusChanged()

private ImageView img; 
private boolean isFullyInitialized = false; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    img=(ImageView)findViewById(R.id.imageView1); 
} 


@Override 
public void onWindowFocusChanged(boolean hasFocus) 
{ 
    super.onWindowFocusChanged(hasFocus); 
    if (hasFocus && !isFullyInitialized) 
    { 
     isFullyInitialized = true; 
     openCvCode(); 
    } 
} 

private void openCvCode() 
{ 
    Bitmap bmp = BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher); 

    Mat tmp = new Mat(bmp.getWidth(), bmp.getHeight(), CvType.CV_8U); 

    Utils.bitmapToMat(bmp, tmp); 

    Imgproc.cvtColor(tmp, tmp, Imgproc.COLOR_RGB2GRAY); 
    Imgproc.cvtColor(tmp, tmp, Imgproc.COLOR_RGB2GRAY,4); 

    Utils.matToBitmap(tmp, bmp); 
    img.setImageBitmap(bmp); 
} 
0

问题解决了:

public class MainActivity extends Activity { 

ImageView img; 
Bitmap bitmap; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    img=(ImageView)findViewById(R.id.imageView1); 

    bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.lena); 

    if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_2, this, mOpenCVCallBack)) 
    { 
     Log.e("TEST", "Cannot connect to OpenCV Manager"); 
    } 


} 

private BaseLoaderCallback mOpenCVCallBack = new BaseLoaderCallback(this) { 
    @Override 
    public void onManagerConnected(int status) { 
     switch (status) { 
       case LoaderCallbackInterface.SUCCESS: 
       { 

        Mat tmp = new Mat(bitmap.getWidth(), bitmap.getHeight(),CvType.CV_8UC1); 
        // Convert 
        Utils.bitmapToMat(bitmap, tmp); 

        Mat gray = new Mat(bitmap.getWidth(), bitmap.getHeight(),CvType.CV_8UC1); 
        // Conver the color 
        Imgproc.cvtColor(tmp, gray, Imgproc.COLOR_RGB2GRAY); 
        // Convert back to bitmap 
        Mat destination = new Mat(gray.rows(),gray.cols(),gray.type()); 

        Imgproc.adaptiveThreshold(gray, destination, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY_INV, 15, 4); 

        Utils.matToBitmap(destination, bitmap); 
        img.setImageBitmap(bitmap); 

       } break; 
       default: 
       { 
        super.onManagerConnected(status); 
       } break; 
      } 
    } 
    }; 

}

+0

你能编辑这个答案来给出更多细节什么是根本原因,你为什么选择这个解决方案?以这种方式,对于可能与您具有相同问题(即相同的根本原因)的其他用户来说更有帮助。 – helleye