OpenCv не возвращает серое значение для местоположения Apple Pencil в XCode - PullRequest
0 голосов
/ 20 марта 2020

У меня есть это приложение, которое берет изображение (в OpenCVWrapper) в оттенках серого и преобразует яркость указанного раздела c, который касается Apple Pencil, в звук. Темные области не издают никаких звуков, средние области создают среднюю высоту звука, а яркие области - высокую высоту звука.

Но по некоторым причинам код работает в некоторых областях изображения безупречно, а в других он почти полностью изменен.

Эта часть называется OpenCVWrapper.h, это файл в моем Xcodeproject

#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface OpenCVWrapper : NSObject
+ (UInt16) getGrayVal:(int)i :(int)j;
@end
NS_ASSUME_NONNULL_END

Затем этот файл сохраняется как OpenCVWrapper.mm

#import "OpenCVWrapper.h"
#import <opencv2/opencv.hpp>
@implementation OpenCVWrapper

+ (UInt16) getGrayVal:(int)i :(int)j{
    cv::Mat grayMat;
    NSString *path = [[NSBundle mainBundle] pathForResource:@"gausshighres" ofType:@"png"];
    const char * cpath = [path cStringUsingEncoding:NSUTF8StringEncoding];
    grayMat = cv::imread(cpath,cv::IMREAD_ANYDEPTH);
    return grayMat.at<UInt16>(i, j);
}
@end

, что на мой взгляд контроллер в этой строке

let grayVal = Double(OpenCVWrapper.getGrayVal(Int32(round(y)),Int32(round(x))))

x и y - местоположение пера

        let x = pencilStrokeRecognizer.touchLocation.x
        let y = pencilStrokeRecognizer.touchLocation.y

Проблема в том, что значение, которое я получаю для grayVal, в некоторых местах неверно. Он называет темные области с большим серым, а яркие области являются случайными. Это неправильно примерно в 50% случаев, и я не знаю почему.

Здесь указан полный код, но я выяснил, что проблема заключается в этом разделе, может быть

Звук в приложении Swift случайно не соответствует интенсивности яркости раздела изображения?

Это изображение, которое он обрабатывает

В целом, оно не возвращает ошибок, но по какой-то причине не работает.

NEW STUFF Так я масштабировал изображение:

        //Calculate point at which pencil is touching with respect to the input image
func pencilTouchHandler(touch: UITouch) {
    //Get point at which user is touching
    let currentPoint = touch.location(in: self.coordinateSpaceView)

    //Excute if touch input is within the image
    if currentPoint.x >= origin.x && currentPoint.y >= origin.y
        && currentPoint.x < (origin.x + size.width-1)
        && currentPoint.y < (origin.y + size.height-1){

        //Track whether or not touch was within the boundaries of the image
        touchInImage = true

        //Calculate (x,y) coordinates with respect to input image
        //Use ratio of original image dimensions
        let xVal = (imageSize.width / size.width)*(currentPoint.x - origin.x)
        let yVal = (imageSize.height / size.height)*(currentPoint.y - origin.y)

        //Record Touch Location
        touchLocation = CGPoint(x: xVal, y: yVal)
        lastTouch = currentPoint
    }
}

, а затем я сделал

   let x = pencilStrokeRecognizer.touchLocation.x
   let y = pencilStrokeRecognizer.touchLocation.y

1 Ответ

0 голосов
/ 20 марта 2020

Вы уверены, что X и Y для карандаша соответствуют X и Y для изображения? Я подозреваю, что нет. Изображение может отображаться в масштабе на экране. Изображение может быть перевернуто на экране, чтобы сохранить его в памяти. Может быть смещение на левой или правой стороне, вызванное системой координат окна, которая не соответствует экрану.

Чтобы отладить это, попробуйте изменить изображение. Используйте изображение только с четырьмя цветами: белый квадрат, занимающий четверть экрана, черный, составляющий четверть экрана, серый, составляющий четверть экрана, и т. Д. c.

Вы должны быть в состоянии увидеть, если изображение легко перевернуто. Вы сможете увидеть, есть ли проблема с масштабированием, обнаружив, что переход происходит не в том месте. Как только вы узнаете, что происходит, вы сможете прочитать документацию, чтобы выяснить, что происходит, чтобы правильно сопоставить перо х и у с изображением х и у.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...