java - 矩阵与浮点opencv android的乘法

标签 java android opencv image-processing rgb

我是 android studio 开发人员的新手,我希望将图像从 RGB 颜色空间转换为 YIQ。我的应用程序包括将图像作为输入,然后将图像传输到 YIQ,因此我使用 Core.split 从图像中获取红色、绿色和蓝色 channel ,然后应用方程,但我无法应用带 float 的矩阵,所以我使用了标量类型,但仍然卡住了。

    public class MainActivity extends AppCompatActivity {

    private static final String TAG = "3:qinQctivity";
    Button button;
    ImageView imageView;

    ArrayList<Mat> RGB = new ArrayList<Mat>(3);
    ArrayList<Mat> YIQ = new ArrayList<Mat>(3);

    Mat newImage;

    Mat Blue,Green,Red,I,Y,Q,B,X,D,W;


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


        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if (!OpenCVLoader.initDebug()) {
                    OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_4_0, getApplicationContext(), baseLoaderCallback);
                } else {
                    baseLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);

                }

            }
        });

    }

    BaseLoaderCallback baseLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            super.onManagerConnected(status);
            if (status == LoaderCallbackInterface.SUCCESS) {
                try {
                    Y = new Mat();
                    Q = new Mat();
                    I = new Mat();
                    X = new Mat();
                    newImage = Utils.loadResource(getApplicationContext(), R.drawable.retinalimage, CvType.CV_32FC3);


                    Core.split(newImage, RGB);

                    Blue = RGB.get(0);
                    Red = RGB.get(1);
                    Green = RGB.get(2);







                            B = new Mat(); // result
                            D = new Mat(); // result
                            W = new Mat(); // result


                            /*working on Y channel*/

                            Scalar alpha_Y = new Scalar(0.299); // the factor
                             Log.i(TAG, "onManagerConnected: "+ alpha_Y.toString());
                            Scalar alpha1_Y = new Scalar(0.587); // the factor
                            Scalar alpha2_Y = new Scalar(0.114); // the factor


                             Core.multiply(Red,alpha_Y, B, CV_32F);
                             Log.i(TAG, "onManagerConnected: " + B);
                             Core.multiply(Green,alpha1_Y,D, CV_32F);
                             Core.multiply(Blue,alpha2_Y,W, CV_32F);
                             Core.add(B,D,Y);
                             Log.i(TAG, "onManagerConnected: "+ Y.toString());
                             Core.add(Y,W,Y);

                             /*working on I channel*/
                             /*I = 0.211 * Red - 0.523 * Green + 0.312 * Blue;*/
                            Mat Z = new Mat(); // result
                            Mat P = new Mat(); // result
                            Mat O = new Mat(); // result

                            Scalar alpha_I = new Scalar(0.211); // the factor
                            Scalar alpha1_I = new Scalar(0.523); // the factor
                            Scalar alpha2_I = new Scalar(0.312); // the factor


                            Core.multiply(Red,alpha_I,Z);
                            Core.multiply(Green,alpha1_I,P);
                            Core.multiply(Blue,alpha2_I,O);
                            Core.add(Z,P,I);
                            Core.add(I,O,I);


                             /*working on Q channel*/
                             /*Q = 0.596 * Red - 0.274 * Green - 0.322 * Blue;*/

                             Mat V = new Mat();
                             Mat W = new Mat();
                             Mat N = new Mat();

                            Scalar alpha_Q = new Scalar(0.596); // the factor
                            Scalar alpha1_Q = new Scalar(0.274); // the factor
                            Scalar alpha2_Q = new Scalar(0.322); // the factor


                            Core.multiply(Red,alpha_Q,V);
                            Core.multiply(Green,alpha1_Q,W);
                            Core.multiply(Blue,alpha2_Q,N);
                            Core.subtract(V,W,Q);
                            Core.subtract(Q,N,Y);


                            YIQ.set(0, Y);
                            YIQ.set(1, I);
                            YIQ.set(2, Q);


                    Log.i(TAG, "onManagerConnected: "+YIQ.toString());

                            Core.merge(YIQ,X);
                    Log.i(TAG, "onManagerConnected: "+X.toString());
                            showImage(X);


//
                        } catch(IOException e){
                            e.printStackTrace();
                        }

                    }


                }


            } ;

            void showImage (Mat y){
                Bitmap bm = Bitmap.createBitmap(y.width(), y.height(), Bitmap.Config.ARGB_8888);
                Utils.matToBitmap(y, bm);
                imageView.setImageBitmap(bm);
            }
        }

最佳答案

更改这部分代码

 YIQ.set(0, Y);
 YIQ.set(1, I);
 YIQ.set(2, Q);

像这样

 YIQ.add(0, Y);
 YIQ.add(1, I);
 YIQ.add(2, Q);

也可能与内存问题有关,请尝试优化您的代码

关于java - 矩阵与浮点opencv android的乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51614290/

相关文章:

android - Dagger 2 注入(inject)多个接口(interface)和实现类

opencv - 使用openCV检测Hazmat标签(菱形正方形)

opencv - 访问 OpenCV 1.0 图像像素值并在 FFTW 中使用它们

java - 对多个数组元素执行 JUnit 断言 - 当一个元素失败时如何处理?

java - 如何计算 GWT 2.3 中的指数?

java - 我怎么知道是否在被测单元上调用了方法?

java - 在 Android 中使用 ContactsContract 检索电话号码 - 功能不起作用

android - com.google.tagmanager.InstallReferrerReceiver 上的 ClassNotFoundException

python - 使用 Python 转换 OpenCV triangulatePoints 输出以用于 perspectiveTransform

java - JOptionPane Swing