S 2.1修復画像ウィジェット(簡易版)
22442 ワード
OpenCVによるinpaint()プレゼンテーション src入力画像 inpaintMaskマスク、入力マトリクスと同じsizeの白黒マトリクス.白は興味のあるエリアを表します.ここでは修復が必要な領域を指します. dst出力画像 inpaintRadiusはレンダリング半径で、一般的には小半径3で、大半径はぼやけやすい. flags修復方法、2種類あります:INPAINT_NSとINPAINT_TELEA.
グラフィックプログラム
マウスコールバック関数の作成
透かしを取り除く小道具を作る
OpenCVに付属のhighguiを利用して小さなアプリケーションを作り、マウスで透かしの位置を描き、透かしを除去することをサポートします.
(完)
CV_EXPORTS_W void inpaint(
InputArray src,
InputArray inpaintMask,
OutputArray dst,
double inpaintRadius,
int flags
);
#include
using namespace cv;
int main()
{
Mat src = imread("images/favorite/cat.jpg");
Mat dst;
Rect rect0(624, 655, 400, 20);//
Mat mask = Mat::zeros(src.size(), CV_8UC1);
mask(rect0).setTo(255);
inpaint(src, mask, dst, 3, INPAINT_NS);
imshow("mask", mask);
imshow("src", src);
imshow("dst", dst);
waitKey(0);
return 0;
}
グラフィックプログラム
マウスコールバック関数の作成
CV_EXPORTS void setMouseCallback(const String& winname, MouseCallback onMouse, void* userdata = 0);
#include
using namespace cv;
Mat mask_board;
int width = 5;
int paint_or_wipe = 1;
void draw_dot(int event, int x, int y, int flags, void *ustc)
{
Scalar color;
if(paint_or_wipe)
color = (255);
else
color = (0);
if(event == EVENT_LBUTTONDOWN)
rectangle(mask_board, Point(x-width/2, y-width/2), Point(x+width/2, y+width/2), color, -1);
if(event == EVENT_MOUSEMOVE and flags == EVENT_FLAG_LBUTTON)
rectangle(mask_board, Point(x-width/2, y-width/2), Point(x+width/2, y+width/2), color, -1);
}
int main()
{
Mat src = imread("images/favorite/cat.jpg");
mask_board = Mat::zeros(src.size(), CV_8UC1);
imshow("mask_board", mask_board);
setMouseCallback("mask_board", draw_dot);
int k = 1;
createTrackbar("paint_or_wipe", "mask_board", &k, 1);
while (1)
{
paint_or_wipe = k;
imshow("mask_board", mask_board);
if(waitKey(1) == 'q')
break;
}
return 0;
}
透かしを取り除く小道具を作る
OpenCVに付属のhighguiを利用して小さなアプリケーションを作り、マウスで透かしの位置を描き、透かしを除去することをサポートします.
#include
using namespace cv;
Mat mask_board;
const int width = 7;
int paint_or_wipe = 1;
int show = 1;
void draw_dot(int event, int x, int y, int flags, void *ustc)
{
Scalar color;
if(paint_or_wipe)
color = (255);
else
color = (0);
if(event == EVENT_LBUTTONDOWN or (event == EVENT_MOUSEMOVE and flags == EVENT_FLAG_LBUTTON))
rectangle(mask_board, Point(x - width / 2, y - width / 2), Point(x + width / 2, y + width / 2), color, -1);
}
int main()
{
Mat src = imread("images/favorite/my.jpg");
Mat dst;
mask_board = Mat(src.size(), CV_8UC1, Scalar(0));
imshow("image", src);
setMouseCallback("image", draw_dot);
createTrackbar("paint_or_wipe", "image", &paint_or_wipe, 1);
createTrackbar("show", "image", &show, 1);
while (1)
{
if(waitKey(1) == 'q')
break;
inpaint(src, mask_board, dst, 3, INPAINT_NS);
if(!show)
bitwise_and(src, Scalar(0, 0, 0), dst, mask_board);
imshow("image", dst);
}
waitKey(0);
return 0;
}
(完)