Android 从原生c+访问Mat的OpenCv单元格值+;安卓应用的功能
:) 我正在编写一个算法,用于检测图像的对称径向中心,检测眼睛在人脸图像中的位置。我知道已经存在一个公共领域的项目来做这项工作,但我会把我的工作建立在另一种研究的基础上 这是一个场景: 通过手动逐帧操作,我看到在java层编写代码,如下所示: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
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)