利用opencv加数字水印的问题。涉及mat类。求助!

jin349620491 2014-11-16 12:17:51
做一个数字水印的程序,利用opencv读入一张图片Input.jpg和水印Insert.jpg。抹去图片RGB值的后两位(从二进制的角度看),将水印图片的值(共八位,也是二进制角度,0至255)取两位放入。也就是将水印图片的一个像素的RGB信息放入Input图片的四个像素中。然后写出图片Output.jpg。再通过一个读出水印的程序来逆转这个过程并且从中读出水印。可能由于mat类的数据类型问题,读出的水印图像是噪点图(但是依稀看得出读入图像的大概轮廓)。但是不知道怎么修改,对opencv的了解实在是太肤浅了,所以前来求助!代码如下

//WaterMark.cpp
#include <tchar.h>
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\highgui\highgui.hpp>

using namespace std;
using namespace cv;

char window_name[] = "WaterMark Window";
Mat src, dst, com;

int main(int argc, _TCHAR* argv[])
{
namedWindow(window_name, CV_WINDOW_AUTOSIZE);
src = imread("Input.jpg", 1);
dst = imread("Insert.jpg", 1);
com = src.clone();
int counti = 0;
int countj = 0;
int temp = 0;
for (int l = 0; l < 3; l++)
{
counti = 0;
countj = 0;
for (int i = 0; i < dst.rows; i++)
{
for (int j = 0; j < dst.cols; j++)
{
temp = dst.at<Vec3b>(i, j).val[l];
//cout << dst.at<Vec3b>(i, j).val[l] << endl;
for (int k = 0; k < 4; k++)
{
com.at<Vec3b>(counti, countj).val[l] = src.at<Vec3b>(counti, countj).val[l] - src.at<Vec3b>(counti, countj).val[l] % 4 + temp % 4;
//com.at<Vec3b>(counti, countj).val[l] = 0;
//com.at<Vec3b>(i, j) = dst.at<Vec3b>(i, j);
temp = temp / 4;
countj++;
if (countj == src.cols)
{
countj = 0;
counti++;
}
}
}
}
}
imshow(window_name, com);
bool imwrisuc = imwrite("Output.jpg", com);
if (!imwrisuc)
{
cout << "error!" << endl;
return 0;
}
waitKey(0);
return 0;
}


//DeWaterMark.cpp

#include <tchar.h>
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\highgui\highgui.hpp>

using namespace std;
using namespace cv;

char window_name[] = "DeMark Window:";
Mat com, dst, out;

int main(int argc, _TCHAR* argv[])
{
namedWindow(window_name, CV_WINDOW_AUTOSIZE);
com = imread("Output.jpg", 1);
dst = imread("Insert.jpg", 1);
out = dst.clone();
int counti = 0;
int countj = 0;
int val = 0;
//imshow(window_name, out);
for (int l = 0; l < 3; l++)
{
counti = 0;
countj = 0;
for (int i = 0; i < dst.rows; i++)
{
for (int j = 0; j < dst.cols; j++)
{
val = 0;
for (int count = 0; count < 4; count++)
{
val = val + (com.at<Vec3b>(counti, countj).val[l] % 4) * pow(4, count);
countj++;
if (countj == com.cols)
{
countj = 0;
counti++;
}
}
out.at<Vec3b>(i, j).val[l] = val;
}
}
}
cout << "finished!" << endl;
imwrite("OOutPut.jpg", out);
//imshow(window_name, out);
waitKey(0);
return 0;

}
...全文
820 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
JohnnyWho 2017-04-27
  • 打赏
  • 举报
回复
楼主问题解决了吗?
kuyuzhiqi 2016-11-25
  • 打赏
  • 举报
回复
楼主,问题解决了吗?
Melaw 2015-10-10
  • 打赏
  • 举报
回复
我最近和你在做一样的东西 也是谁有无法提取 想问下你后来这个问题解决了么……求教

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧