将Mat转换为Bitmap会导致错误

时间:2016-10-20 08:49:58

标签: android opencv bitmap opencv4android corner-detection

我正在使用OpenCV4Android版本2.4.11,我正在尝试检测图像中的cornrs。为此,我正在使用 Harris 角落探测器。我面临的问题是,在检测到图像中的角落后如下图所示 在代码中我想在将其转换为Bitmap后显示包含检测到的角的图像,但随后我收到以下发布的错误。

执行步骤1和步骤2没有错误,但是当我运行第3步时,我得到了发布的logcat错误。

请让我知道为什么我收到此错误以及如何解决?

#include <iostream>
#include <vector>
using namespace std;

int main() {

    vector<int> numbers;
    int numofNumbers = 0;
    int number;

    cout << "Enter the number of numbers you want multipled: ";
    cin >> numofNumbers;

    for (numofNumbers; numofNumbers > 0; numofNumbers = numofNumbers - 1) {

        cout << "Enter a number";
        cin >> number;
        numbers.push_back(number); // store the numbers
        cout << endl;

    }


    // do what you want with stored numbers in the vector....
    // ....
    //
    for (auto it: numbers){
        cout << it << std::endl;
    }

return 0;

}

错误

//step 1
this.mMatGray = new Mat();
Imgproc.cvtColor(this.mMatInputFrame, this.mMatGray, Imgproc.COLOR_BGR2GRAY);

//step 2
Imgproc.cornerHarris(mMatGray,mMatGray,3,3,3,1);

//step 3
final Bitmap bitmap = Bitmap.createBitmap(mMatInputFrame.cols(), mMatInputFrame.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(mMatGray, bitmap);
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
mIVEdges.setImageBitmap(bitmap);
    }
});

UPDATE1

现在在测试了“MIkka Marmik”提供的以下代码后,我收到了以下错误

OpenCV Error: Assertion failed (src.type() == CV_8UC1 || src.type() == CV_8UC3 || src.type() == CV_8UC4) in void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, jclass, jlong, jobject, jboolean), file /hdd2/buildbot/slaves/slave_ardbeg1/50-SDK/opencv/modules/java/generator/src/cpp/utils.cpp, line 98
E/org.opencv.android.Utils: nMatToBitmap catched cv::Exception: /hdd2/buildbot/slaves/slave_ardbeg1/50-SDK/opencv/modules/java/generator/src/cpp/utils.cpp:98: error: (-215) src.type() == CV_8UC1 || src.type() == CV_8UC3 || src.type() == CV_8UC4 in function void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, jclass, jlong, jobject, jboolean)
E/AndroidRuntime: FATAL EXCEPTION: Thread-2477
Process: com.example.cornerdetection_00, PID: 22407
CvException [org.opencv.core.CvException: /hdd2/buildbot/slaves/slave_ardbeg1/50-SDK/opencv/modules/java/generator/src/cpp/utils.cpp:98: error: (-215) src.type() == CV_8UC1 || src.type() == CV_8UC3 || src.type() == CV_8UC4 in function void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, jclass, jlong, jobject, jboolean)
]
at org.opencv.android.Utils.nMatToBitmap2(Native Method)
at org.opencv.android.Utils.matToBitmap(Utils.java:123)
at org.opencv.android.Utils.matToBitmap(Utils.java:132)
at com.example.cornerdetection_00.FragOpenCVCam.cornerHarris(FragOpenCVCam.java:204)
at com.example.cornerdetection_00.FragOpenCVCam.onCameraFrame(FragOpenCVCam.java:159)
at org.opencv.android.CameraBridgeViewBase.deliverAndDrawFrame(CameraBridgeViewBase.java:387)
at org.opencv.android.JavaCameraView$CameraWorker.run(JavaCameraView.java:346)

错误

Mat mMatGray = new Mat();
Imgproc.cvtColor(mMatGray, mMatGray, Imgproc.COLOR_BGR2GRAY);
//step 2
Imgproc.cornerHarris(mMatGray,mMatGray,3,3,3,1);
//step 3
final Bitmap bitmap = Bitmap.createBitmap(mMatGray.cols(), mMatGray.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(mMatGray, bitmap);

2 个答案:

答案 0 :(得分:1)

createBitmap方法期望图像为1,3或4个通道。您必须将输出mMatGray转换为createBitmap方法所需的格式。但是,在检查了哈里斯角算法的OpenCV documentation后,还需要更多步骤来设置角点检测图像。试试这个:

Mat src_gray        = new Mat();
Mat dst             = new Mat();
Mat dst_norm        = new Mat();
Mat dst_norm_scaled = new Mat();

// Detector parameters
int blockSize = 2;
int apertureSize = 3;
double k = 0.04;
// Filter params
int thresh = 200;
int max_thresh = 255;

// Detecting corner
Imgproc.cvtColor(src, src_gray, Imgproc.COLOR_BGR2GRAY);
Imgproc.cornerHarris(src_gray, dst, blockSize, apertureSize, k);

// Normalizing
Core.normalize(dst, dst_norm, 0, 255, Core.NORM_MINMAX);
Core.convertScaleAbs(dst_norm, dst_norm_scaled);

// Drawing a circle around corners
for (int j = 0; j < dst_norm.rows(); j++) {
    for (int i = 0; i < dst_norm.cols(); i++) {
        if (dst_norm.get(j, i)[0] > thresh) {
            Core.circle(dst_norm_scaled, new Point(i, j), 5, new Scalar(255));
        }
    }
}

// Create bitmap
final Bitmap bitmap = Bitmap.createBitmap(dst_norm_scaled.cols(), dst_norm_scaled.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(dst_norm_scaled, bitmap);

答案 1 :(得分:0)

试试这个

   Mat mMatGray = new Mat();
    mMatGray = Highgui.imread(path);
    Imgproc.cvtColor(mMatGray, mMatGray, Imgproc.COLOR_RGB2BGR);
    Imgproc.cvtColor(mMatGray, mMatGray, Imgproc.COLOR_BGR2GRAY);
    //step 2
  Imgproc.cornerHarris(mMatGray,mMatGray,3,3,3,1);
  Core.normalize(mMatGray, mMatGray, 0, 255, Core.NORM_MINMAX, CvType.CV_32FC1, new Mat());
  Core.convertScaleAbs(mMatGray, mMatGray);
//step 3
  final Bitmap bitmap = Bitmap.createBitmap(mMatGray.cols(), mMatGray.rows(), Bitmap.Config.ARGB_8888);
 Utils.matToBitmap(mMatGray, bitmap);