【问题标题】:OpenCV C++ calcHist to JavaOpenCV C++ calcHist 到 Java
【发布时间】:2016-03-17 21:16:28
【问题描述】:

我正在尝试让一些 c++ 代码在我的 Android 设备上运行;但是,我遇到了我正在使用的Mat 类型的一个小问题。我要转换的代码如下(第二个函数调用第一个):

static Mat
histc_(const Mat& src, int minVal=0, int maxVal=255, bool normed=false)
{
    Mat result;
    // Establish the number of bins.
    int histSize = maxVal-minVal+1;
    // Set the ranges.
    float range[] = { static_cast<float>(minVal), static_cast<float>(maxVal+1) };
    const float* histRange = { range };
    // calc histogram
    calcHist(&src, 1, 0, Mat(), result, 1, &histSize, &histRange, true, false);
    // normalize
    if(normed) {
        result /= (int)src.total();
    }
    return result.reshape(1,1);
}

static Mat histc(InputArray _src, int minVal, int maxVal, bool normed)
{
    Mat src = _src.getMat();
    switch (src.type()) {
        case CV_8SC1:
            return histc_(Mat_<float>(src), minVal, maxVal, normed);
            break;
        case CV_8UC1:
            return histc_(src, minVal, maxVal, normed);
            break;
        case CV_16SC1:
            return histc_(Mat_<float>(src), minVal, maxVal, normed);
            break;
        case CV_16UC1:
            return histc_(src, minVal, maxVal, normed);
            break;
        case CV_32SC1:
            return histc_(Mat_<float>(src), minVal, maxVal, normed);
            break;
        case CV_32FC1:
            return histc_(src, minVal, maxVal, normed);
            break;
        default:
            CV_Error(Error::StsUnmatchedFormats, "This type is not implemented yet."); break;
    }
    return Mat();
}

现在我的 java 代码将这 2 个函数合并为 1,因为我的类型始终相同:CV_32SC1。

private Mat histc(Mat src, int minVal, int maxVal)
{
    Mat result = new Mat();

    MatOfInt histSize = new MatOfInt(maxVal - minVal + 1);

    MatOfFloat histRange = new MatOfFloat(minVal, maxVal + 1);
    MatOfInt channels = new MatOfInt(0);
    Log.d(TAG, "Type: " + CvType.typeToString(src.type()));
    src.convertTo(src, CvType.CV_32S);
    Imgproc.calcHist(Arrays.asList(src), channels, new Mat(), result, histSize, histRange);

    return result.reshape(1,1);
}

我收到一个错误OpenCV Error: Unsupported format or combination of formats () in void cv::calcHist,我从另一个问题中发现这是因为我的src 矩阵的类型是CV_32SC1。所以我的问题是我不知道如何将这些行从第二个 c++ 函数正确转换为 Java:

case CV_32SC1:
        return histc_(Mat_<float>(src), minVal, maxVal, normed);
        break;

我正试图弄清楚如何在 Java 中专门做类似于 Mat_&lt;float&gt;(src) 的事情。

供参考:here 是我现在正在尝试做的整个代码的链接

【问题讨论】:

    标签: java c++ opencv histogram lbph-algorithm


    【解决方案1】:
    Mat_<float>(src)
    

    只需按照calcHist 的要求,使用 src 的内容创建一个 CV_32F 类型的新 Mat 对象。

    所以做一个就足够了

    src.convertTo(src, CvType.CV_32F);
    

    【讨论】:

    • 效果很好!谢谢你……修复起来也很简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 2015-05-05
    • 2013-02-19
    • 2015-11-24
    • 1970-01-01
    • 2018-10-31
    • 2012-12-25
    相关资源
    最近更新 更多