我正在探索 OpenCv 的功能并尝试手动实现 k-means 聚类(我知道一个现成的函数)。 在编写代码时,我收到错误
“E0413 不存在从 cv::MatExpr”到“int”的合适转换函数
第 32 行。 你能帮我吗?
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace cv;
cv::Mat k_means_clustering(cv::Mat image, int k, int max_iterations = 1000) {
cv::Mat pixels = image.reshape(1, image.total());
pixels.convertTo(pixels, CV_32F);
cv::Mat center = initialize_center(pixels, k);
cv::Mat labels(pixels.rows, 1, CV_32S);
for (int iteration = 0; iteration < max_iterations; iteration++) {
labels = assign_to_clusters(pixels, center);
cv::Mat new_center = update_center(pixels, labels, k);
if (cv::countNonZero(center != new_center) == 0) {
break;
}
center = new_center;
}
center.convertTo(center, CV_8U);
cv::Mat segmented_image = center.row(labels.t()).reshape(3, image.rows).clone();
return segmented_image;
}
第 32 行是 return 语句之前的那一行。
我尝试将变量声明更改为
cv::Mat_<int> labels;
但是出现错误
E0413 不存在从“cv::MatExpr”到“int”的合适转换函数
问题是对
的调用,它接受一个整数作为参数。但是,您传入的是cv::Mat::row
——即转置的labels.t()
(即使它是 1x1 仍然不会被视为整数)。Mat
– 丹·马塞克