Esempio n. 1
0
PERF_TEST_P(InpaintArea_InpaintingMethod, inpaint,
            testing::Combine(
                testing::Values(::perf::szSmall24, ::perf::szSmall32, ::perf::szSmall64),
                InpaintingMethod::all()
                )
            )
{
    Mat src = imread(getDataPath("gpu/hog/road.png"));

    Size sz = get<0>(GetParam());
    int inpaintingMethod = get<1>(GetParam());

    Mat mask(src.size(), CV_8UC1, Scalar(0));
    Mat result(src.size(), src.type());

    Rect inpaintArea(src.cols/3, src.rows/3, sz.width, sz.height);
    mask(inpaintArea).setTo(255);

    declare.in(src, mask).out(result).time(120);

    TEST_CYCLE() inpaint(src, mask, result, 10.0, inpaintingMethod);

    Mat inpaintedArea = result(inpaintArea);
    SANITY_CHECK(inpaintedArea);
}
Esempio n. 2
0
void MainWindow::mouseHandler(int event, int x, int y, int flags, void* param)
{
    MainWindow* window = (MainWindow*) param;
    if (window->mode == 3) {
        x = bound(x, window->R, window->_src.cols-1-window->R);
        y = bound(y, window->R, window->_src.rows-1-window->R);
    }
    else {
        x = bound(x, 0, window->_src.cols-1);
        y = bound(y, 0, window->_src.rows-1);
    }

    // user press left button
    if (event == CV_EVENT_LBUTTONDOWN && !window->drag) {
        if (window->mode == 1)
            window->point = Point(x, y);
        else if (window->mode == 2) {
            window->points.clear();
            window->points.push_back(Point(x, y));
        }
        else if (window->mode == 3) {
            Rect box = Rect(x-window->R, y-window->R, 1+window->R*2, 1+window->R*2);
            Mat temp;
            medianBlur(window->_dst(box), temp, window->kernel);
            temp.copyTo(window->_dst(box), window->round_mask);
            window->round_mask.copyTo(window->zone(box), window->round_mask);
            imshow("Image", window->_dst);
        }
        window->drag = true;
    }

    // user drag the mouse
    if (event == CV_EVENT_MOUSEMOVE && window->drag) {
        Mat temp = window->_dst.clone();

        if (window->mode == 1)
            rectangle(temp, window->point, Point(x, y), CV_RGB(255, 0, 0), 2, 8, 0);
        else if (window->mode == 2) {
            window->pts = (const Point*)Mat(window->points).data;
            window->npts = window->points.size();
            window->points.push_back(Point(x, y));
            polylines(temp, &window->pts, &window->npts, 1, false, Scalar(0,0,255), 2, 8, 0);
        }
        else if (window->mode == 3) {
            Rect box = Rect(x-window->R, y-window->R, 1+window->R*2, 1+window->R*2);
            Mat temp;
            medianBlur(window->_dst(box), temp, window->kernel);
            temp.copyTo(window->_dst(box), window->round_mask);
            window->round_mask.copyTo(window->zone(box), window->round_mask);
            imshow("Image", window->_dst);
            return;
        }

        imshow("Image", temp);
    }

    // user release left button
    if (event == CV_EVENT_LBUTTONUP && window->drag) {
        if (window->mode == 1) {
            Point temp(window->point);
            window->point.x = min(x, temp.x);
            x = max(x, temp.x);
            window->point.y = min(y, temp.y);
            y = max(y, temp.y);

            rectangle(window->zone, window->point, Point(x, y), Scalar(255), CV_FILLED, 8, 0);
            Rect box = Rect(window->point.x, window->point.y, x - window->point.x, y - window->point.y);

            if (window->style == 1) {
                medianBlur(window->_dst(box), window->_dst(box), window->kernel);
                medianBlur(window->_dst(box), window->_dst(box), window->kernel);
            }
            else {
                Mat mask = Mat::zeros(window->_src.size(), CV_8UC1);
                rectangle(mask, window->point, Point(x, y), CV_RGB(255, 255, 255), CV_FILLED, 8, 0);
                inpaint(window->_dst, mask, window->_dst, 5, INPAINT_TELEA);
            }
        }
        else if (window->mode == 2) {
            Rect box = boundingRect(window->points);
            vector< vector<Point> > contour;
            contour.push_back(window->points);
            Mat mask = Mat::zeros(window->_src.size(), CV_8UC1);
            fillPoly(mask, contour, Scalar(255));
            fillPoly(window->zone, contour, Scalar(255));

            if (window->style == 1) {
                Mat temp;
                medianBlur(window->_dst(box), temp, window->kernel);
                medianBlur(temp, temp, window->kernel);
                temp.copyTo(window->_dst(box), mask(box));
            }
            else
                inpaint(window->_dst, mask, window->_dst, 5, INPAINT_TELEA);
        }

        imshow("Image", window->_dst);
        window->drag = false;
    }

    // user click right button: reset all
    if (event == CV_EVENT_RBUTTONUP) {
        window->_dst = window->_src.clone();
        window->zone = Mat::zeros(window->_src.size(), CV_8UC1);
        window->drag = false;
        imshow("Image", window->_dst);
    }
}