如何在 OpenCV4Android 中进行迭代
How to Iterate in OpenCV4Android
我使用 OpenCV4Android 将这段代码转换为 Java。但是它们不是 Java-OpenCV4Android 中 matiterator 的包装器。
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 class。我在 OpenCV 支持部分看到了类似的问题,但没有答案。
1) 是否有任何替代方法可以将其转换为 java(如果可能的话,可以进行有效的迭代)。
2) 我不想使用本机代码。
提前致谢。
我想 OpenCV4Android 中没有默认的迭代器。所以用正常的迭代解决了它。
与 C++ 代码相同的结果,但我没有使用高度和宽度,而是使用主图像来运行并从中获取高度和宽度,任何东西都可以。
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 将这段代码转换为 Java。但是它们不是 Java-OpenCV4Android 中 matiterator 的包装器。
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 class。我在 OpenCV 支持部分看到了类似的问题,但没有答案。
1) 是否有任何替代方法可以将其转换为 java(如果可能的话,可以进行有效的迭代)。 2) 我不想使用本机代码。
提前致谢。
我想 OpenCV4Android 中没有默认的迭代器。所以用正常的迭代解决了它。
与 C++ 代码相同的结果,但我没有使用高度和宽度,而是使用主图像来运行并从中获取高度和宽度,任何东西都可以。
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;
}