当前位置: 首页 > 知识库问答 >
问题:

使用mixChannels函数(opencv)时,出现“致命信号11 (SIGSEGV),代码1”

宗政博
2023-03-14

我尝试用Android JNI和OpenCV开发应用程序,得到了一个可怕的错误:libc:致命信号11 (SIGSEGV),代码1,tid 28694中的错误地址0xfffffffc。

我按照这篇文章来实现这个算法,当我在Visual studio 2015上运行它时,它工作得很好。但是当我尝试在Android JNI上实现它时,它出现了以下错误。

这是我的代码:

#include <jni.h>
#include <opencv2/opencv.hpp>


using namespace std;
using namespace cv;

extern "C" {
JNIEXPORT void JNICALL
Java_com_noah_demojniexp_MainActivity_autofix(JNIEnv *env, jobject instance, jlong matAddr,
                                          jlong dstAddr, jfloat clipHistPercent) {
Mat &src = *((Mat *) matAddr);
Mat &dst = *((Mat *) dstAddr);

CV_Assert(clipHistPercent >= 0);
CV_Assert((src.type() == CV_8UC1) || (src.type() == CV_8UC3) || (src.type() == CV_8UC4));

int histSize = 256;
float alpha, beta;
double minGray = 0, maxGray = 0;

//to calculate grayscale histogram
Mat gray;
if (src.type() == CV_8UC1) gray = src;
else if (src.type() == CV_8UC3) cvtColor(src, gray, CV_BGR2GRAY);
else if (src.type() == CV_8UC4) cvtColor(src, gray, CV_BGRA2GRAY);
if (clipHistPercent == 0)
{
    // keep full available range
    minMaxLoc(gray, &minGray, &maxGray);
}
else
{
    Mat hist; //the grayscale histogram

    float range[] = { 0, 256 };
    const float* histRange = { range };
    bool uniform = true;
    bool accumulate = false;
    calcHist(&gray, 1, 0, Mat (), hist, 1, &histSize, &histRange, uniform, accumulate);

    // calculate cumulative distribution from the histogram
    std::vector<float> accumulator(histSize);
    accumulator[0] = hist.at<float>(0);
    for (int i = 1; i < histSize; i++)
    {
        accumulator[i] = accumulator[i - 1] + hist.at<float>(i);
    }

    // locate points that cuts at required value
    float max = accumulator.back();
    clipHistPercent *= (max / 100.0); //make percent as absolute
    clipHistPercent /= 2.0; // left and right wings
    // locate left cut
    minGray = 0;
    while (accumulator[minGray] < clipHistPercent)
        minGray++;

    // locate right cut
    maxGray = histSize - 1;
    while (accumulator[maxGray] >= (max - clipHistPercent))
        maxGray--;
}

// current range
float inputRange = maxGray - minGray;

alpha = (histSize - 1) / inputRange;   // alpha expands current range to histsize range
beta = -minGray * alpha;             // beta shifts current range so that minGray will go to 0

// Apply brightness and contrast normalization
// convertTo operates with saurate_cast
src.convertTo(dst, -1, alpha, beta);

// restore alpha channel from source
if (dst.type() == CV_8UC4)
{
    int from_to[] = { 3, 3};
    mixChannels(&src, 4, &dst,1, from_to, 1);
}
return;

}
}

我创建了一个类extends org.opencv.core.Mat

public class SMat extends Mat {
public void autofix(Mat m,float clip){
    MainActivity.native_autofix(nativeObj,m.nativeObj,clip);
}
}

并在主活动中使用它

Bitmap bm1 = BitmapFactory.decodeResource(getResources(),R.mipmap.s3);
SMat mat1 = new SMat();
SMat mat2 = new SMat();
Utils.bitmapToMat(bm1,mat1);
mat1.autofix(mat2,5);
Bitmap bm2 = Bitmap.createBitmap(bm1);
Utils.matToBitmap(mat1,bm2);
iv2.setImageBitmap(bm2);

调试时,我发现混音频道功能是原因,如果评论一下,一切都会好的。我不知道为什么会错。请帮忙!谢谢大家!

共有2个答案

冯茂实
2023-03-14

我找到了解决方案,只需将第二个参数更改为1,因为源Mat仅包含一个Mat :D。

陆弘新
2023-03-14

源矩阵和目标矩阵必须具有相同的大小和深度。

您可以从源矩阵克隆目标矩阵的大小,如下所示

Mat dst=src.clone();

在目标字段中,它具有相同的原始图像的大小和深度,然后将其传递给混合通道函数

 类似资料:
  • 我对cocos Creator是个新手。我正在做一个游戏,当我按下home键回到应用程序时,应用程序崩溃了。调试时显示此错误: 如果有人能用简单的话解释我该怎么做。提前道谢。

  • 在开发过程中,一个错误一直随机出现。我忽略了它(我的错),因为应用程序需要发布,我在任何地方都没有找到解决方案,这让我发疯。 无论如何 Logcat打印此错误: A/libc:无效的地址或损坏的块0xb8f6eed8传递给dlfree的地址 A/libc:致命信号11 (SIGSEGV),代码1,tid 5429中的故障地址0x dead baad(FinalizerDaemon) 由于这没有告诉

  • 这里有人以前遇到过这个错误吗?我能做些什么来解决这个问题? 谢谢:)

  • 截至今天,我已经开始收到此错误: A/libc:致命信号11 (SIGSEGV),代码1 (SEGV_MAPERR),tid 31968中的故障地址0x0 在某些设备上调用MobileAds.initialize(this)时。如果我卸载程序并重新安装,它在第一次打开应用程序时就像预期的那样工作,但如果我关闭并再次打开应用程序,我又开始崩溃了。删除MobileAds.initialize(这)也解

  • 我正在尝试使用PDFDocument在Android上创建一个多页PDF文件。创建一个新页面(方法newPDFPage())后,下一行,例如

  • 我正在用HERE SDK开发一个应用程序,到现在为止一切工作都很好。我得到这样的错误: 或以下错误: 它们让我的应用崩溃了。 并不总是相同的错误,但它们总是单独出现在我的Logcat中,没有其他信息。 在我使用的所有应用程序中,我都在使用对象和服务,即使打印stacktrace,我也没有得到关于错误的更多信息。 我只是注意到,这些错误几乎是随机出现的,但只有在我使用这些对象/服务时才会出现。 我用