Published on

Using OpenCV to hack game Lyto Different Color on OSX

Using OpenCV to hack game Lyto different color on OSX.

Demo with 193 level

Build OpenCV on OSX

Required

  • CMake 2.8.8 or higher
  • Xcode 10 or higher
  • Python 2.7 or higher

Building OpenCV from Source

git clone https://github.com/opencv/opencv.git python opencv/platforms/ios/build_framework.py ios

Copy opencv2.framework into hackcolor directory.

Methodology

  • Take a screenshot of the rect of screen.
  • Detect the circles in the screenshot using Hough in OpenCV.
  • Process circles:
    • Check radius
    • Find circle with different color
  • Simulate mouse click on screen
  • Similate the result on screen.

Using function HoughCircles in openCV to detect array circles from image

+ (NSDictionary *)hack:(NSImage *)image {
    cv::Mat src;
    NSImageToMat(image, src);

    cv::Mat gray;
    cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY);
    cv::medianBlur(gray, gray, 5);
    std::vector<cv::Vec3f> circles;
    HoughCircles(gray, circles, cv::HOUGH_GRADIENT, 1,
                 src.rows/16,
                 100, 70, 10, 300
                 );

    cv::Point tempPoint;
    NSMutableArray *arrPoints = [[NSMutableArray alloc] init];

    if(circles.size() > 3) {

        std::vector<cv::Vec3b> vColors;

        int tempRadius = circles[0][2];
        for( size_t i = 0; i < circles.size(); i++ )
        {
            cv::Vec3i c = circles[i];
            int radius = c[2];
            //NSLog(@"%ld %d %d", i, tempRadius, radius);

            if(std::abs(tempRadius - radius) < 5){
                vColors.push_back(GetColorFromMat(src, c));
                cv::Point center = cv::Point(c[0], c[1]);
                cv::circle( src, center, radius-2, cv::Scalar(255,0,255), 2, cv::LINE_AA);
            }
        }
        for( size_t i = 0; i < vColors.size(); i++ ) {
            cv::Vec3b color1 = vColors[i];
            bool flag = true;
            for( size_t j = 0; j < vColors.size(); j++ ) {
                cv::Vec3b color2 = vColors[j];
                if(i!=j && color1[0]==color2[0] && color1[1]==color2[1] && color1[2]==color2[2]) {
                    flag = false;
                }
            }
            if(flag){
                cv::Vec3i c = circles[i];
                tempPoint = cv::Point(c[0], c[1]);
                cv::circle( src, tempPoint, 10, cv::Scalar(255,0,255), 4, cv::LINE_8);
                NSLog(@"%ld R: %d G:%d B:%d", i, color1[0], color1[1], color1[2]);
                [arrPoints addObject: @{ @"x": [NSNumber numberWithInt:tempPoint.x],
                                         @"y": [NSNumber numberWithInt:tempPoint.y]}];
            }
        }
        if(arrPoints.count>1){
            NSLog(@"xx: %ld", arrPoints.count);
        }
    }

    return @{
        @"image": MatToNSImage(src),
        @"points": arrPoints,
    };
}

Source code: https://github.com/chuongtrh/hack_lyto_different_color_osx

Thanks for reading and happy sharing