Я выполняю сопоставление функций и перевожу код с c ++ на c #. Но я не знаю, как справиться со следующей строкой.
descriptors_scene_clusters[clusterIndex].at<uchar>(pt) = descriptors_scene.at<uchar>(pt);
В OpenCVSharp нет аналогичного метода для обработки этого случая. В c # Mat.At (здесь принимается только целое число).
[код C ++]
Mat labels;
int estimate_cluster_count = 3; // estimated ??????????
kmeans(keypoints_scene_points, estimate_cluster_count, labels, TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 10, 1.0), 3, KMEANS_RANDOM_CENTERS);
std::cout << "==================================111111\n";
Mat descriptors_scene_clusters[3] = { Mat(descriptors_scene.rows, descriptors_scene.cols, CV_8U, Scalar(0)) };
std::cout << "==================================111111------\n";
for (int i=0; i<labels.rows; i++) {
int clusterIndex = labels.at<int>(i);
Point2f pt = keypoints_scene_points.at<Point2f>(i);
descriptors_scene_clusters[clusterIndex].at<uchar>(pt) = descriptors_scene.at<uchar>(pt); // ?????? error
}
[код C #]
// image object
using (Mat img_object=Cv2.ImRead(@"C:\CSWIN\VS32\20.bmp"))
// image scene
using (Mat img_scene=Cv2.ImRead(@"C:\CSWIN\VS32\Train.bmp"))
// descripter for object
using (var descriptorsObject = new Mat())
// descripter for scene
using (var descriptorsScene = new Mat())
// matcher
using (var matcher = new BFMatcher(NormTypes.L2SQR))
// labels
using (var labels = new Mat())
// using Accelerate KAZE
using (var kaze = AKAZE.Create())
{
// key points for object and scene
KeyPoint[] keypointsObject, keypointsScene;
// get AKAZE keypoints and descriptors for img_object --> object
kaze.DetectAndCompute(img_object, null, out keypointsObject, descriptorsObject);
// get AKAZE keypoints and descriptors for img_scene ---> scene
kaze.DetectAndCompute(img_scene, null, out keypointsScene, descriptorsScene);
// keypoints scene points
Mat keyPointsScenePoints = new Mat(keypointsScene.Count(), 1, MatType.CV_32FC1);
// get the key points scene points
for (int i = 0; i < keypointsScene.Count(); i++)
{
keyPointsScenePoints.Set<Point2f>(i, keypointsScene[i].Pt);
}
int estimated_cluster_count = 9;
var result = Cv2.Kmeans(
data:keyPointsScenePoints,
k:estimated_cluster_count,
bestLabels:labels,
TermCriteria.Both(10, 1.0),
3,
KMeansFlags.RandomCenters);
//
List<Mat> descriptors_scene_clusters = new List<Mat>();
for (int i = 0; i < estimated_cluster_count; i++)
{
descriptors_scene_clusters.Add(new Mat(descriptorsScene.Rows, descriptorsScene.Cols, MatType.CV_8UC1, new Scalar(0)));
}
//
for (int i = 0; i < labels.Rows; i++)
{
int clusterIndex = labels.At<int>(i);
Point2f pt = keyPointsScenePoints.At<Point2f>(i);
//
var value = descriptorsScene.At<byte>()
descriptors_scene_clusters[clusterIndex].At<byte>(?) = descriptorsScene.At<byte>(?);
}
Ваша помощь будетбыть оцененным! Могу ли я использовать Mat.Set (index, value) в качестве альтернативы? Как получить индекс и значение?