如何在OpenCV4Android中进行迭代 [英] How to Iterate in OpenCV4Android

查看:84
本文介绍了如何在OpenCV4Android中进行迭代的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经使用OpenCV4Android将这段代码转换为Java.但是在OpenCV4Android中,它们不是Matiterator的Java包装器.

I had this piece of code to be converted into Java using OpenCV4Android. But their are no Java-Wrappers for matiterator in OpenCV4Android.

void show_result(const cv::Mat& labels, const cv::Mat& centers, int height, int width)
{
        std::cout << "===\n";
        std::cout << "labels: " << labels.rows << " " << labels.cols << std::endl;
        std::cout << "centers: " << centers.rows << " " << centers.cols << std::endl;
        assert(labels.type() == CV_32SC1);
        assert(centers.type() == CV_32FC1);

        cv::Mat rgb_image(height, width, CV_8UC3);
        cv::MatIterator_<cv::Vec3b> rgb_first = rgb_image.begin<cv::Vec3b>();
        cv::MatIterator_<cv::Vec3b> rgb_last = rgb_image.end<cv::Vec3b>();
        cv::MatConstIterator_<int> label_first = labels.begin<int>();

        cv::Mat centers_u8;
        centers.convertTo(centers_u8, CV_8UC1, 255.0);
        cv::Mat centers_u8c3 = centers_u8.reshape(3);

        while ( rgb_first != rgb_last ) {
                const cv::Vec3b& rgb = centers_u8c3.ptr<cv::Vec3b>(*label_first)[0];
                *rgb_first = rgb;
                ++rgb_first;
                ++label_first;
        }
        cv::imshow("tmp", rgb_image);
        cv::imwrite("Kmean/25.jpg", rgb_image);

        cv::waitKey();
}

我在Java中找不到MatIterator类.我在OpenCV支持部分看到了与此类似的问题,但没有答案.

I can't find MatIterator class in java. I saw a questiion similar to this posted in OpenCV support section, but no answer.

1)是否有其他方法可以将其转换为Java(如果可能的话,可以进行有效的迭代). 2)我不想使用本机代码.

1) Is there any alternative way to convert this to java (if possible in efficient iterations). 2) I don't want to use native code.

提前谢谢.

推荐答案

我想OpenCV4Android中没有默认的迭代器.因此,可以通过常规迭代解决它.

i guess there are no default iterators in OpenCV4Android. So solved it with normal iteration.

与C ++代码相同的结果,但是我没有使用高度和宽度,而是使用主图像来起作用,并从中获取了高度和宽度,一切都很好.

Same result as C++ code but instead of taking height and width i took main image in to function and got height and width from it anything would be jst fine.

public static Mat show_result(Mat labels, Mat centers, Mat imageMat){

        centers.convertTo(centers, CvType.CV_8UC1, 255.0);
        centers.reshape(3);

        List<Mat> clusters = new ArrayList<Mat>();
        for(int i = 0; i < centers.rows(); i++) {
            clusters.add(Mat.zeros(imageMat.size(), imageMat.type()));
        }

        SparseIntArray counts = new SparseIntArray();
        for(int i = 0; i < centers.rows(); i++) counts.put(i, 0);

        int rows = 0;
        for(int y = 0; y < imageMat.rows(); y++) {
            for(int x = 0; x < imageMat.cols(); x++) {
                int label = (int)labels.get(rows, 0)[0];
                int r = (int)centers.get(label, 2)[0];
                int g = (int)centers.get(label, 1)[0];
                int b = (int)centers.get(label, 0)[0];
                counts.put(label, counts.get(label) + 1);
                clusters.get(label).put(y, x, b, g, r);
                rows++;
            }
        }
        System.out.println(counts);
        return combineClusters(clusters);
    }

    public  static Mat combineClusters(List<Mat> clusters){

        Mat result = new Mat(clusters.get(0).size(), CvType.CV_8UC3);
        result.setTo(new Scalar(0));

        for(int i=0; i < clusters.size(); i++){
            Core.bitwise_xor(result, clusters.get(i), result);
        }

        return result;
    }

这篇关于如何在OpenCV4Android中进行迭代的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆