【问题标题】:ADD and subtract with openCV用openCV加减法
【发布时间】:2018-09-24 13:33:08
【问题描述】:

我在 android-studio 上使用 opencv 3.0.0,我需要将 RGB 图像转换为 YIQ,所以我必须做一些加法和减法方程。我使用 openCV 的 Core.Split 从 RGB 图像中获取红色、绿色和蓝色通道。然后我使用这个通道使用这个方程计算 YIQ 图像:equation。经过我的 appp 测试后,我得到了这个错误:A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x19b in tid 27631 (orstackoverflow), pid 27631 (orstackoverflow) 这是我的代码

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_0_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
                Scalar alpha1_Y = new Scalar(0.587); // the factor
                Scalar alpha2_Y = new Scalar(0.114); // the factor



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

                /*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

                /*working on I channel*/
                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.add(Y);
                YIQ.add(I);
                YIQ.add(Q);

                Core.merge(YIQ,X);
                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);
}

【问题讨论】:

    标签: android opencv image-processing


    【解决方案1】:

    您没有为垫子B,D,W,Z,P,O,... 分配内存。您需要获取原始 RGB 矩阵的大小并将大小传递给新的矩阵构造函数。根据OpenCV documentationmultiply函数:

    参数:

    src1 - 第一个源数组。

    src2 - 与 src1 大小和类型相同的第二个源数组。

    dst - 与 src1大小和类型相同的目标数组。

    (突出显示我的)

    【讨论】:

    • 感谢您的帮助,我想通了。问题出在我手机的 opencv_manager 版本,默认版本是 3.0.0 所以我必须用 adb 安装 3.4 版本,它已经解决了
    猜你喜欢
    • 2010-12-13
    • 1970-01-01
    • 2018-01-30
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    相关资源
    最近更新 更多