如何通过javacv实现图片去水印(附代码)

网友投稿 957 2023-01-02


如何通过javacv实现图片去水印(附代码)

最近工作需求要做图片去水印的功能,研究了一段时间发现javacv能做这个功能,然后总结了一下。

首先导入maven

org.bytedeco

javacv

1.4.3

org.bytedeco

javacpp

org.bytedeco.javacpp-presets

flycapture

org.bytedeco.javacpp-presets

libdc1394

org.bytedeco.javacpp-presets

libfreenect

org.bytedeco.javacpp-presets

libfreenect2

org.bytedeco.javacpp-presets

librealsense

org.bytedeco.javacpp-presets

videoinput

org.bytedeco.javacpp-presets

tesseract

org.bytedeco.javacpp-presets

leptonica

org.bytedeco.javacpp-presets

flandmark

org.bytedeco.javacpp-presets

artoolkitplus

org.bytedeco

javacv-platform

1.4.3

org.bytedeco

javacv

org.bytedeco.javacpp-presets

flycapture-platform

org.bytedeco.javacpp-presets

libdc1394-platform

org.bytedeco.javacpp-presets

libfreenect-platform

org.bytedeco.javacpp-presets

libfreenect2-platform

org.bytedeco.javacpp-presets

librealsense-platform

org.bytedeco.javacpp-presets

videoinput-platform

org.bytedeco.javacpp-presets

tesseract-platform

org.bytedeco.javacpp-presets

leptonica-platform

org.bytedeco.javacpp-presets

flandmark-platform

org.bytedeco.javacpp-presets

artoolkitplus-platform

org.bytedeco.javacpp-presets

ffmpeg

4.0.2-1.4.3

开始进行实现:

第一步:

前景背景求差法

#include

#include

#include

#include "opencv2/photo/photo.hpp"

#include

using namespace std;

using namespace cv;

int main(int argc, char** argv)

{

cv::VideoCapture cap("C:/Users/zyy/Desktop/test_logs/test.mp4");

if (!cap.isOpened())

{

cout << "Failed!" << endl;

return -1;

}

Mat result, mask, dst1;

Mat inpaintMask1;

Mat inpaintMask = imread("C:/Users/zyy/Desktop/test_logs/log5.jpg");

cv::cvtColor(inpaintMask, inpaintMask, CV_BGR2GRAY);

cv::namedWindow("Result", 1);

cv::namedWindow("Frame", 1);

int i = 0;

for (;;)

{

Mat frame;

cap >> frame;

if (!frame.data)

{

cout << "Over!" << endl;

break;

}

if (i <= 2) //看视频,自己调试确定这个值,二十几帧之后左上角那个小图才出来,所以选了30

{

if (i == 2)

{

mask = frame;

cv::cvtColor(mask, mask, CV_BGR2GRAY);

//Mat inpaintMask1(mask.rows, mask.cols, CV_32FC1, 1);

inpaintMask1 = mask;

}

}

else

{

cv::bitwise_and(result, mask, mask);//前景背景求差法

if (i > 2 && i <= 40)

{

cv::cvtColor(frame, result, CV_BGR2GRAY);

cv::bitwise_and(result, mask, mask);//前景背景求差法

inpaintMask1 = mask;

imwrite("C:/Users/zyy/Desktop/test_logs/jpg", inpaintMask1);

}

Mat inpainted;

inpaint(frame, inpaintMask, inpainted, 8, CV_INPAINT_TELEA);

imshow("inpainted image", inpainted);

imshow("Frame", frame);

imshow("Result", mask);

//waitKey();

if (cv::waitKey(33) >= 0) break;

}

i++;

}

waitKey();

return 0;

}

第二步:

logo和水印位置检测

#include

#include "cv.h"

#include "cxcore.h"

#include "highgui.h"

using namespace std;

int main()

{

IplImage *src = cvLoadImage("C:/Users/zyy/Desktop/test_logs/22.jpg", 0);

IplImage *srcResult = cvLoadImage("C:/Users/zyy/Desktop/test_logs/22.jpg", 3); //用来显示

IplImage *templat = cvLoadImage("C:/Users/zyy/Desktop/test_logs/yk2.jpg", 0);

IplImage *result;

if (!src || !templat)

{

cout << "打开图像失败" << endl;

return 0;

}

int srcW, srcH, templatW, templatH, resultH, resultW;

srcW = src->width;

srcH = src->height;

templatW = templat->width;

templatH = templat->height;

if (srcW < templatW || srcH < templatH)

{

cout << "模板不能比原图像小" << endl;

return 0;

}

resultW = srcW - templatW + 1;

resultH = srcH - templatH + 1;

result = cvCreateImage(cvSize(resultW, resultH), 32, 1);

cvMatchTemplate(src, templat, result, CV_TM_SQDIFF_NORMED);//CV_TM_SQDIFF_NORMED

double minValue, maxValue;

CvPoint minLoc, maxLoc;

cvMinMaxLoc(result, &minValue, &maxValue, &minLoc, &maxLoc);

cout << "最小值:" << minValue << " 最大值:" << maxValue << endl;

cvRectangle(srcResult, minLoc, cvPoint(minLoc.x + templatW, minLoc.y + templatH), cvScalar(0, 0, 255));

cvNamedWindow("srcResult", 0);

cvNamedWindow("templat", 0);

cvShowImage("srcResult", srcResult);

cvShowImage("templat", templat);

cvWaitKey(0);

cvReleaseImage(&result);

cvReleaseImage(&templat);

cvReleaseImage(&srcResult);

cvReleaseImage(&src);

return 0;

}

第三步:

在已经求得掩膜图像的情况下,进行去logo操作。

static String video_path="D://video//videos//";

public static void ets( ) {

Mat inpaintMask = new Mat();

Mat inpainted=new Mat();

Mat template = imread("D://video//movie_10.jpg");

Mat frame = new Mat();

cvtColor(template, inpaintMask, COLOR_BGR2GRAY);

VideoCapture cap = new VideoCapture("D://video//mp4//1553583032966-480p.mp4");

if(!cap.isOpened())

return;

String fileName=video_path+"VideoTest12.mp4";

Size size = new Size((int)cap.get(CV_CAP_PROP_FRAME_WIDTH), (int)cap.get(CV_CAP_PROP_FRAME_HEIGHT));

double fps = cap.get(http://CV_CAP_PROP_FPS);

VideoWriter vw1 = new VideoWriter(fileName, CV_FOURCC((byte)'D',(byte)'I',(byte)'V',(byte)'3'), fps/6, size, true);

int start =11;

int end =20;

for (int i=start;i

frame = imread("D://video//images//movie_"+i+".jpg");

inpaint(frame, inpaintMask, inpainted, 8, INPAINT_TELEA);

// opencv_imgcodecs.imwrite(video_path+"eguid"+i+".jpg", inpainted);

vw1.write(inpainted); //写成视频文件

}

vw1.release();

}

上述的图像和MP4文件自己准备就可以。感兴趣的可以去测试了。

frame = imread("D://video//images//movie_"+i+".jpg");

inpaint(frame, inpaintMask, inpainted, 8, INPAINT_TELEA);

// opencv_imgcodecs.imwrite(video_path+"eguid"+i+".jpg", inpainted);

vw1.write(inpainted); //写成视频文件

}

vw1.release();

}

上述的图像和MP4文件自己准备就可以。感兴趣的可以去测试了。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:企业访客管理系统接口设计(公司访客管理)
下一篇:微服务服务网关(微服务统一网关)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~