Файл универсальный (три среза), но в нем нет (n) ошибки среза ARMv7-s для статических библиотек на iOS, в любом случае, чтобы обойти?

Нет простой функции для доступа к подпикселю, но я могу предложить несколько вариантов:

  1. Используйте getRectSubPix и извлеките область 1 пиксель:
    cv::Vec3b getColorSubpix(const cv::Mat& img, cv::Point2f pt)
    {
        cv::Mat patch;
        cv::getRectSubPix(img, cv::Size(1,1), pt, patch);
        return patch.at(0,0);
    }
    
  2. Используйте более гибкий, но менее точный remap с однопиксельной картой:
    cv::Vec3b getColorSubpix(const cv::Mat& img, cv::Point2f pt)
    {
        cv::Mat patch;
        cv::remap(img, patch, cv::Mat(1, 1, CV_32FC2, &pt), cv::noArray(),
            cv::INTER_LINEAR, cv::BORDER_REFLECT_101);
        return patch.at(0,0);
    }
    
  3. Реализуйте билинейную интерполяцию самостоятельно, так как это не наука о ракетах:
    cv::Vec3b getColorSubpix(const cv::Mat& img, cv::Point2f pt)
    {
        assert(!img.empty());
        assert(img.channels() == 3);
    
        int x = (int)pt.x;
        int y = (int)pt.y;
    
        int x0 = cv::borderInterpolate(x,   img.cols, cv::BORDER_REFLECT_101);
        int x1 = cv::borderInterpolate(x+1, img.cols, cv::BORDER_REFLECT_101);
        int y0 = cv::borderInterpolate(y,   img.rows, cv::BORDER_REFLECT_101);
        int y1 = cv::borderInterpolate(y+1, img.rows, cv::BORDER_REFLECT_101);
    
        float a = pt.x - (float)x;
        float c = pt.y - (float)y;
    
        uchar b = (uchar)cvRound((img.at(y0, x0)[0] * (1.f - a) + img.at(y0, x1)[0] * a) * (1.f - c)
                               + (img.at(y1, x0)[0] * (1.f - a) + img.at(y1, x1)[0] * a) * c);
        uchar g = (uchar)cvRound((img.at(y0, x0)[1] * (1.f - a) + img.at(y0, x1)[1] * a) * (1.f - c)
                               + (img.at(y1, x0)[1] * (1.f - a) + img.at(y1, x1)[1] * a) * c);
        uchar r = (uchar)cvRound((img.at(y0, x0)[2] * (1.f - a) + img.at(y0, x1)[2] * a) * (1.f - c)
                               + (img.at(y1, x0)[2] * (1.f - a) + img.at(y1, x1)[2] * a) * c);
    
        return cv::Vec3b(b, g, r);
    }
    

403
задан Peter Mortensen 16 February 2013 в 09:35
поделиться