Как конвертировать C ++ Mat.At <uchar>(Point2f) в C # Mat.At <byte>(?) - PullRequest
0 голосов
/ 14 октября 2019

Я выполняю сопоставление функций и перевожу код с 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) в качестве альтернативы? Как получить индекс и значение?

...