OpenCV学习之图像域的填充

来源:互联网 发布:php html页面生成图片 编辑:程序博客网 时间:2024/05/16 19:19

鼠标点击图像,像Photoshop选区工具一样选区相似图像区域,进行填充颜色

//图像域的填充#include "cv.h"#include "highgui.h"IplImage* color_img0;IplImage* mask;IplImage* color_img;IplImage* gray_img0 = NULL;IplImage* gray_img = NULL;int ffill_case = 1;int lo_diff = 20;int up_diff = 20;int connectivity = 4;int is_color = 1;int is_mask = 0;int new_mask_val = 255;void on_mouse(int event, int x, int y, int flags, void* param) {    //鼠标事件    if (!color_img) {        return;    }    switch (event) {    case CV_EVENT_LBUTTONDOWN:        {            CvPoint seed = cvPoint(x, y);            int lo = ffill_case == 0 ? 0 : lo_diff;            int up = ffill_case == 0 ? 0 : up_diff;            int flags = connectivity + (new_mask_val << 8) + (ffill_case == 1 ? CV_FLOODFILL_FIXED_RANGE : 0);            int b = rand() & 255, g = rand() & 255, r = rand() & 255;            CvConnectedComp comp;            if (is_mask)                cvThreshold(mask, mask, 1, 128, CV_THRESH_BINARY);            if (is_color) {                CvScalar color = CV_RGB(r, g, b);                cvFloodFill(color_img, seed, color, CV_RGB(lo, lo, lo), CV_RGB(up, up, up), &comp, flags, is_mask ? mask : NULL);                cvShowImage("image", color_img);            }            else {                CvScalar brightness = cvRealScalar((r * 2 + g * 7 + b + 5) / 10);                cvFloodFill(gray_img, seed, brightness, cvRealScalar(lo),                    cvRealScalar(up), &comp, flags,                    is_mask ? mask : NULL);                cvShowImage("image", gray_img);            }            printf("%g pixels were repainted\n", comp.area);            if (is_mask)                cvShowImage("mask", mask);        }        break;    }}int main(int argc, char** argv) {    color_img0 = cvLoadImage("Lena.tiff", 1);    printf("Hot Keys:\n"        "\ESC - quit\n"        "\tc - switch color/grayscale mode\n"        "\tm - switch mask mode\n"        "\tr - restore the original image\n"        "\ts - use null-range floodfill\n"        "\tf - use gradient floodfill with fixed(absolute) rangle\n"        "\tg - use gradient floodfill with floating(relative) range\n"        "\t4 - use4-connectivity mode\n"        "\t8 - use8-connectivity mode\n");    color_img = cvCloneImage(color_img0);    gray_img0 = cvCreateImage(cvGetSize(color_img), 8, 1);    cvCvtColor(color_img, gray_img0, CV_BGR2GRAY);    gray_img = cvCloneImage(gray_img0);    mask = cvCreateImage(cvGetSize(color_img), 8, 1);    cvNamedWindow("image", 0);    cvCreateTrackbar("lo_diff", "image", &lo_diff, 255, NULL);    cvCreateTrackbar("up_diff", "image", &up_diff, 255, NULL);    //鼠标事件    cvSetMouseCallback("image", on_mouse, 0);    while (1) {        int c;        if (is_color)            cvShowImage("image", color_img);        else            cvShowImage("image", gray_img);        c = cvWaitKey(0);        switch ((char)c) {        case '\x1b':            goto exit_main;        case 'c':            if (is_color) {                printf("\tc - switch color/grayscale mode\n");                cvCvtColor(color_img, gray_img, CV_BGR2GRAY);                is_color = 0;            }            else {                cvCopy(color_img0, color_img, NULL);                cvZero(mask);                is_color = 1;            }            break;        case 'm':            if (is_mask) {                cvDestroyWindow("mask");                is_mask = 0;            }            else {                cvNamedWindow("mask", 0);                cvZero(mask);                cvShowImage("mask", mask);                is_mask = 1;            }            break;        case 'r':            cvCopy(color_img0, color_img, NULL);            cvCopy(gray_img0, gray_img, NULL);            cvZero(mask);            break;        case 's':            ffill_case = 0;            break;        case 'f':            ffill_case = 1;            break;        case 'g':            ffill_case = 2;        case '4':            connectivity = 4;            break;        case '8':            connectivity = 8;            break;        }    }exit_main:    cvDestroyWindow("test");    cvReleaseImage(&gray_img);    cvReleaseImage(&gray_img0);    cvReleaseImage(&color_img);    cvReleaseImage(&color_img0);    cvReleaseImage(&mask);    return 1;}
原创粉丝点击