gpt4 book ai didi

android - ConvexHull Android ndk 和 Opencv 中的参数无效

转载 作者:太空宇宙 更新时间:2023-11-03 22:28:20 25 4
gpt4 key购买 nike

我的 Android 应用程序的 jni 文件夹中有这个 C++ OpenCV 代码 hello-jni.cpp .我只想找到并绘制 convexhull 但原因是 hull[i] convexhull 方法生成错误“无效参数”。如果我投(vector<point>(hull[i]))程序运行并生成此错误:

libc "Fatal signal 11 (SIGSEGV) at 0x00000004 (code=1)"

非常感谢任何帮助。

#include <jni.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <android/log.h>
#include <opencv/cv.h>
#include <vector>
#include <cmath>
#include <opencv2/opencv.hpp>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#define LOG_TAG "hellojni"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
#define ORIGCOL2ANDROIDORGCOL CV_BGR2BGRA

using namespace std;
using namespace cv;

extern "C" {

JNIEXPORT jint JNICALL Java_com_elmira_getconvexhull_MainActivity_convertNativeGray(
JNIEnv*, jobject, jlong addrRgba, jlong addrGray);
JNIEXPORT jint JNICALL Java_com_elmira_getconvexhull_MainActivity_convertNativeGray(
JNIEnv*, jobject, jlong addrRgba, jlong addrGray) {

Mat& mRgb = *(Mat*)addrRgba;
Mat& mGray = *(Mat*)addrGray;

int conv = 0;
jint retVal;

Mat src; Mat src_gray;
src = mRgb;

cvtColor(src, src_gray, CV_BGR2GRAY);
blur(src_gray, src_gray, Size(3, 3));

Mat src_copy = src.clone();
Mat threshold_output;
vector<vector<Point> > contours;
vector<vector<Point> > hull(contours.size());
vector<Vec4i> hierarchy;
int thresh = 100;

threshold(src_gray, threshold_output, thresh, 255, THRESH_BINARY || CV_THRESH_OTSU);

/// Find contours
findContours(threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));


__android_log_print(ANDROID_LOG_INFO, "inmethod", "size %d *** %d", contours.size(), threshold_output.cols);

for (int i = 0; i < contours.size(); i++)
{
convexHull(Mat(contours[i]), hull[i], false, false);
}
retVal = (jint)conv;
return retVal;
}
}

最佳答案

当你初始化hull

vector<vector<Point> > contours;
vector<vector<Point> > hull(contours.size());

hull 大小为 0,因为 contours 大小为 0。所以当您访问 hull[i]您正在越界访问。

findContours 之后声明 hull:

 findContours(threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
vector<vector<Point> > hull(contours.size());

您也可以简单地将 convexHull 称为:

 convexHull(contours[i], hull[i]);

因为第 3 个参数 orientation 默认为 false,当第 2 个参数是 std::vector 时,第 4 个参数 returnPoints 被忽略。


当您使用 THRESH_OTSU 时,

thresh 值将被忽略。


更新

看来Android NDK 有一些问题。一个简单的解决方法是:

  • 禁用无效参数的错误,或者
  • 使用以下内容

代码:

Mat mHull;
convexHull(Mat(contours[i]), mHull, false, true);
hull[i].assign(mHull.begin<Point>(), mHull.end<Point>());

关于android - ConvexHull Android ndk 和 Opencv 中的参数无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33693745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com