Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从原生c+访问Mat的OpenCv单元格值+;安卓应用的功能_Android_C++_Opencv_Matrix_Filtering - Fatal编程技术网

Android 从原生c+访问Mat的OpenCv单元格值+;安卓应用的功能

Android 从原生c+访问Mat的OpenCv单元格值+;安卓应用的功能,android,c++,opencv,matrix,filtering,Android,C++,Opencv,Matrix,Filtering,:) 我正在编写一个算法,用于检测图像的对称径向中心,检测眼睛在人脸图像中的位置。我知道已经存在一个公共领域的项目来做这项工作,但我会把我的工作建立在另一种研究的基础上 这是一个场景: 通过手动逐帧操作,我看到在java层编写代码,如下所示: private Mat mGray = new Mat(height,width,CvType.CV_8U); private Mat mOut = new Mat(height,width,CvType.CV_8U); private Mat mInte

:) 我正在编写一个算法,用于检测图像的对称径向中心,检测眼睛在人脸图像中的位置。我知道已经存在一个公共领域的项目来做这项工作,但我会把我的工作建立在另一种研究的基础上

这是一个场景:

通过手动逐帧操作,我看到在java层编写代码,如下所示:

private Mat mGray = new Mat(height,width,CvType.CV_8U);
private Mat mOut = new Mat(height,width,CvType.CV_8U);
private Mat mIntermediateMat = Mat.zeros(height,width,CvType.CV_32F);   

[...common methods of opencv app...]

public Mat onCameraFrame(CvCameraViewFrame inputFrame) {

    switch (ImageManipulationsActivity.viewMode) {
    case ImageManipulationsActivity.VIEW_MODE_RGBA:
        mOut = inputFrame.rgba();
        break;

    case ImageManipulationsActivity.VIEW_MODE_MODIFY:
        mGray = inputFrame.gray();

        int h = mGray.rows();
        int w = mGray.cols();

        int sobxVal,sobyVal;    

        /** 
        * Appling manually sobel filtering to calculate dx and dy image, 
        * moreover calculate magnitudo matrix and cosValue and sinValue
        * matrices for computing, using lut techniques.
        */
        for(int i = 1; i < h-1; i++)
            for(int j = 1; j < w-1; j++) {
                sobxVal = (int) (
                        ((int)mGray.get(i-1,j)[0] << 1) +
                        mGray.get(i-1,j-1)[0] +
                        mGray.get(i-1,j+1)[0] - (
                        ((int)mGray.get(i+1,j)[0] << 1) +
                        mGray.get(i+1,j-1)[0] +
                        mGray.get(i+1,j+1)[0] ) );
                sobyVal = (int) (
                        ((int)mGray.get(i,j-1)[0] << 1) +
                        mGray.get(i-1,j-1)[0] +
                        mGray.get(i+1,j-1)[0] - (
                        ((int)mGray.get(i,j+1)[0] << 1) +
                        mGray.get(i-1,j+1)[0] +
                        mGray.get(i+1,j+1)[0] ) );
//      compute magnitudo and atan2
            }

//      ...other calculations...

        Core.convertScaleAbs(mIntermediateMat, mOut);

    }

    return mOut;
}
此截取代码的第一个重要问题是,以这种方式使用“at”方法访问mGr单元时:

mGr.at<int>(i,j)
at(i,j)经理
previus检查mGr type是否为int,返回的值不是灰框的有效灰度像素(我通过日志看到)

我假设matrix从java代码到c++代码都存在链接错误,但我不确定这一点

我希望任何人都能帮助我解决这个问题XD

private Mat mRgba;
private Mat mGray;
/*
 * Matrix of 360 cols and 2 rows
 * row[0] cos values
 * row[1] sin values
 */
private static Mat lutCosSin;

/*
 * Matrix 510 x 510 
 * where lutM(i,j) = atan2(i,j)
 */
private static Mat lutMagnitudo

// common methods and declarations...

public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
    final int viewMode = mViewMode;
    switch (viewMode) {
    case VIEW_MODE_RGBA:
        // input frame has RBGA format
        mRgba = inputFrame.rgba();
        break;
    case VIEW_MODE_FEATURES:
        // input frame has RGBA format
        mGray = inputFrame.gray();
        mRgba = Mat.zeros(mGray.rows(), mGray.cols(), mGray.type());
        FindFeatures(
        mGray.getNativeObjAddr(), 
        mRgba.getNativeObjAddr(), 
        lutCosSin.getNativeObjAddr(), 
        lutMagnitudo.getNativeObjAddr()
        );

        //Core.convertScaleAbs(mRgba, mRgba);
//            Log.d(TAG, "Called native function :"+mRgba.submat(new Range(0,5), new Range(0,5)).toString()+
//                  "\nAngles matrix:"+mGray);
        break;
    }

    return mRgba;
}

public native void FindFeatures(long matAddrGr, long matAddrRgba, long matAddrlutCS, long matAddrlutM);
mGr.at<int>(i,j)