2015-03-23 2 views
1

У меня была эта часть кода, которая должна быть преобразована в Java с использованием OpenCV4Android. Но они не являются Java-Wrappers для матитератора в OpenCV4Android.Как Iterate в 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(); 
} 

Я не могу найти класс MatIterator в java. Я видел квест, похожий на это в разделе поддержки OpenCV, но ответа не было.

1) Есть ли альтернативный способ преобразования этого в java (если возможно, в эффективные итерации). 2) Я не хочу использовать собственный код.

Заранее спасибо.

+0

Я голосующий, чтобы отвечать на этот вопрос как не по теме, потому что пользователь просто хочет, чтобы кто-то конвертировал этот код в OpenCV для Android. – karlphillip

+1

@karlphillip Я прошу альтернативный метод в java. Потому что они не являются матитерами класса по умолчанию в OpenCV4Android. –

ответ

1

Я предполагаю, что итераторы по умолчанию в OpenCV4Android отсутствуют. Поэтому он решил его с нормальной итерацией.

То же самое, что и код C++, но вместо того, чтобы принимать высоту и ширину, я взял основное изображение для работы и получил высоту и ширину от него, что-то будет 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; 
    } 
Смежные вопросы