改变一个物体的颜色在Android应用程序 [英] Changing the color of an object in an Android application

查看:439
本文介绍了改变一个物体的颜色在Android应用程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

基本上我的目标是改变物体的颜色进行实时的涂料中的应用。为了实现这一目标,我按照以下概念:

  1. 我用的是精明的()梅托德寻找的对象。
  2. 使用findContours()的边缘检测。
  3. 在使用drawContours()用于着色的对象。如果有任何其他的概念,需要达到的目标,请建议我。我也试过,但没有得到确切的轮廓边缘。原始输入

预计产量

电流输出

  

我得到的图像灰度,但我希望在RGB模式。

这里是我的code:

 包com.example.imageprocess;

进口的java.util.ArrayList;
进口的java.util.List;

进口org.opencv.android.BaseLoaderCallback;
进口org.opencv.android.CameraBridgeViewBase;
进口org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;
进口org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;
进口org.opencv.android.LoaderCallbackInterface;
进口org.opencv.android.OpenCVLoader;
进口org.opencv.core.CvType;
进口org.opencv.core.Mat;
进口org.opencv.core.MatOfPoint;
进口org.opencv.core.Point;
进口org.opencv.core.Scalar;
进口org.opencv.core.Size;
进口org.opencv.imgproc.Imgproc;

进口android.app.Activity;
进口android.os.Bundle;
进口android.util.Log;
进口android.view.WindowManager;

公共类MainActivity扩展活动实现CvCameraViewListener2 {


        私人垫mRgba;
        私人垫mIntermediateMat;
        私人垫mGray;

        私人CameraBridgeViewBase mOpenCvCameraView;

        私人BaseLoaderCallback mLoaderCallback =新BaseLoaderCallback(本){
            @覆盖
            公共无效onManagerConnected(INT状态){
                开关(状态){
                    案例LoaderCallbackInterface.SUCCESS:
                    {
                        Log.i(OPENCVACTIVITY,OpenCV的加载成功);

                        //之后(!)OpenCV的初始化加载机库
                       //的System.loadLibrary(mixed_sample);

                        mOpenCvCameraView.enableView();
                    } 打破;
                    默认:
                    {
                        super.onManagerConnected(状态);
                    } 打破;
                }
            }
        };

       / *公共MainActivity(){
            Log.i(OPENCVACTIVITY,实例化新的+ this.getClass());
        }
* /
    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
          。getWindow()addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

            的setContentView(R.layout.activity_main);

            mOpenCvCameraView =(CameraBridgeViewBase)findViewById(R.id.tutorial2_activity_surface_view);
            mOpenCvCameraView.setCvCameraViewListener(本);
    }



    @覆盖
    公共无效的onPause()
    {
        super.onPause();
        如果(mOpenCvCameraView!= NULL)
            mOpenCvCameraView.disableView();
    }

    @覆盖
    公共无效onResume()
    {
        super.onResume();
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3,这一点,mLoaderCallback);
    }

    公共无效的onDestroy(){
        super.onDestroy();
        如果(mOpenCvCameraView!= NULL)
            mOpenCvCameraView.disableView();
    }

    @覆盖
    公共无效onCameraViewStarted(INT宽度,高度INT){
        // TODO自动生成方法存根
         mRgba =新垫(高度,宽度,CvType.CV_8UC4);
            mIntermediateMat =新垫(高度,宽度,CvType.CV_8UC4);
            mGray =新垫(高度,宽度,CvType.CV_8UC1);

    }

    @覆盖
    公共无效onCameraViewStopped(){
         mRgba.release();
            mGray.release();
            mIntermediateMat.release();

    }

    @覆盖
    公共垫onCameraFrame(CvCameraViewFrame inputFrame){
        垫gaussian_output =新垫();
         mRgba = inputFrame.rgba();
         Imgproc.Canny(inputFrame.gray(),mIntermediateMat,80,100);
         Imgproc.cvtColor(mIntermediateMat,mRgba,Imgproc.COLOR_YUV2RGBA_NV21,4);
         Imgproc.GaussianBlur(mIntermediateMat,gaussian_output,新尺寸(5,5),5);
         名单< MatOfPoint>轮廓=新的ArrayList< MatOfPoint>();
         Imgproc.findContours(gaussian_output,轮廓,新材料(),Imgproc.RETR_EXTERNAL,Imgproc.CHAIN​​_APPROX_SIMPLE,新点(0,0));
         标色=新的标量(165,30,215);
        // Imgproc.drawContours(gaussian_output,轮廓,-1,色,3);
         垫层次=新垫();
      //找到轮廓:
      Imgproc.findContours(gaussian_output,轮廓,层次结构,Imgproc.RETR_TREE,Imgproc.CHAIN​​_APPROX_SIMPLE);
      为(中间体contourIdx = 0; contourIdx&其中; contours.size(); contourIdx ++){
          Imgproc.drawContours(gaussian_output,轮廓,contourIdx,颜色,-1);
      }

        返回gaussian_output;
    }


}
 

解决方案

我相信你所做的灰度图像移动到彩色图像的错误。

尝试: Imgproc.cvtColor(mRgba,mIntermediateMat,Imgproc.COLOR_YUV2RGBA_NV21,4); 代替: Imgproc.cvtColor(mIntermediateMat,mRgba,Imgproc.COLOR_YUV2RGBA_NV21,4);

Basically my goal is change the color of object in real time for paint application. To achieve this goal I follow the following concepts:

  1. I use the canny() metod for finding the object.
  2. Using findContours() for edge detection.
  3. using drawContours() for coloring the object. If there is any other concept require to achieve the goal please suggest me. I have tried but not getting exact contours edge. original input

Expected output

Current output

I am getting image in gray scale but i want in rgb mode.

here is my code:

package com.example.imageprocess;

import java.util.ArrayList;
import java.util.List;

import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.WindowManager;

public class MainActivity extends Activity implements CvCameraViewListener2{


        private Mat                    mRgba;
        private Mat                    mIntermediateMat;
        private Mat                    mGray;

        private CameraBridgeViewBase   mOpenCvCameraView;

        private BaseLoaderCallback  mLoaderCallback = new BaseLoaderCallback(this) {
            @Override
            public void onManagerConnected(int status) {
                switch (status) {
                    case LoaderCallbackInterface.SUCCESS:
                    {
                        Log.i("OPENCVACTIVITY", "OpenCV loaded successfully");

                        // Load native library after(!) OpenCV initialization
                       // System.loadLibrary("mixed_sample");

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

       /* public MainActivity() {
            Log.i("OPENCVACTIVITY", "Instantiated new " + this.getClass());
        }
*/
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
          getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

            setContentView(R.layout.activity_main);

            mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.tutorial2_activity_surface_view);
            mOpenCvCameraView.setCvCameraViewListener(this);
    }



    @Override
    public void onPause()
    {
        super.onPause();
        if (mOpenCvCameraView != null)
            mOpenCvCameraView.disableView();
    }

    @Override
    public void onResume()
    {
        super.onResume();
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);
    }

    public void onDestroy() {
        super.onDestroy();
        if (mOpenCvCameraView != null)
            mOpenCvCameraView.disableView();
    }

    @Override
    public void onCameraViewStarted(int width, int height) {
        // TODO Auto-generated method stub
         mRgba = new Mat(height, width, CvType.CV_8UC4);
            mIntermediateMat = new Mat(height, width, CvType.CV_8UC4);
            mGray = new Mat(height, width, CvType.CV_8UC1);

    }

    @Override
    public void onCameraViewStopped() {
         mRgba.release();
            mGray.release();
            mIntermediateMat.release();

    }

    @Override
    public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
        Mat gaussian_output = new Mat();
         mRgba = inputFrame.rgba();
         Imgproc.Canny(inputFrame.gray(), mIntermediateMat, 80, 100);
         Imgproc.cvtColor(mIntermediateMat, mRgba, Imgproc.COLOR_YUV2RGBA_NV21, 4);
         Imgproc.GaussianBlur(mIntermediateMat, gaussian_output, new Size(5, 5), 5);
         List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
         Imgproc.findContours( gaussian_output, contours, new Mat(),Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0,0) );
         Scalar color = new Scalar(165, 30, 215);
        // Imgproc.drawContours(gaussian_output, contours, -1, color, 3);
         Mat hierarchy = new Mat();
      // find contours:
      Imgproc.findContours(gaussian_output, contours, hierarchy, Imgproc.RETR_TREE,Imgproc.CHAIN_APPROX_SIMPLE);
      for (int contourIdx = 0; contourIdx < contours.size(); contourIdx++) {
          Imgproc.drawContours(gaussian_output, contours, contourIdx,color, -1);
      }

        return gaussian_output;
    }


}

解决方案

I believe that you made the error of moving the grayscale image to the coloured image.

Try: Imgproc.cvtColor(mRgba, mIntermediateMat, Imgproc.COLOR_YUV2RGBA_NV21, 4); Instead of: Imgproc.cvtColor(mIntermediateMat, mRgba, Imgproc.COLOR_YUV2RGBA_NV21, 4);

这篇关于改变一个物体的颜色在Android应用程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆