19,469
社区成员
发帖
与我相关
我的任务
分享
#include "pch.h"
#include<string>
#include<cstdio>
#include <fstream>
#include <iostream>
#define ERROR_STR_SIZE 1024
using namespace std;
using namespace cv;
String todString(String en)
{
if (en.length() == 8)
{
return en;
}
else
{
for (int i = en.length(); i < 8; i++) {
en = "0" + en;
}
return en;
}
}
int PixelTransformation(int em, string im)
{
//cout << "em:" << em << endl;
//cout << "im.substuct:" << im << endl;
int inter = abs(em),y3=inter%2,y2=(inter/2)%2,y1=(inter/4)%2;
//cout << "y1:" << y1 << " y2:" << y2 << " y3:" <<y3<< endl;
int check1 = y1 ^ y2, check2 = y1 ^ y3,check=check1*2+check2,emb=stoi(im,nullptr,2),Result= check ^ emb;
//cout << "check1:" << check1 << " check2:" << check2 << " check:" << check<<" emb:"<<emb<<" Result:"<< Result <<endl;
switch (Result)
{
case 0:
return inter;
case 1:
return inter ^ 1;
case 2:
return inter ^ 2;
case 3:
return inter ^ 4;
default:
break;
}
}
void MyFFmpeg::ffmpegVideoDecodecWithFilePath(const char* filepath,Mat en)
{
Mat src,srcYuv, srcY,srcU,srcV,Y;
Mat imgdst, imgdst2;
int Embedded, enindexX = 0,enindexY=0,imindex=0;
int ca, emb1,emb2,emb3,emb4;
int enrows = en.rows, encols = en.cols;
int embits1, embits2, embits3, embits4;
vector<Mat> channels;
char embeddedbyte[9];
Rect window;
window.height = 8;
window.width = 8;
//imshow("en", en);
//en.convertTo(src, CV_32FC1);
Embedded = (int)en.at<uchar>(enindexX, enindexY);
_itoa_s(Embedded, embeddedbyte,9,2);
string im=embeddedbyte;
im = todString(im);
size_t index = 0;
VideoCapture capture(filepath);
int frame_width = static_cast<int>(capture.get(CAP_PROP_FRAME_WIDTH));
int frame_height = static_cast<int>(capture.get(CAP_PROP_FRAME_HEIGHT));
float frame_fps = capture.get(CAP_PROP_FPS);
int frame_number = static_cast<int>(capture.get(CAP_PROP_FRAME_COUNT));//总帧数
cout << "frame_width is " << frame_width << endl;
cout << "frame_height is " << frame_height << endl;
cout << "frame_fps is " << frame_fps << endl;
cout << "frame_frame_number" << frame_number << endl;
//src = capture.open(filepath);
int type = static_cast<int>(capture.get(CAP_PROP_FOURCC));
VideoWriter writer("VideoTest.flv", type, frame_fps, Size(frame_width, frame_height),true);
//float* pixelPtr = NULL;
if (capture.isOpened())
{
cout << "Open Success!";
}
while (capture.read(src))
{
cvtColor(src, srcYuv, cv::COLOR_BGR2YUV);
//imshow("src", src);
//waitKey(0);
//分割通道
split(srcYuv, channels);
srcY = channels.at(0);
srcU = channels.at(1);
srcV = channels.at(2);
//imshow("Ychannels",srcY);
//imshow("Uchannels", srcU);
//imshow("Vchannels", srcV);
//waitKey(0);
//深度转换
Mat DCTY(src.size(), CV_32FC1);
Mat iDCTY(src.size(), CV_32FC1);
srcY.convertTo(Y, CV_32FC1);
int ycols = Y.cols / 8, yrows = Y.rows / 8;
for (int n = 0; n < ycols; n++)
{
for (int m = 0; m < yrows; m++)
{
window.x = 8 * n;
window.y = 8 * m;
dct(Y(window), DCTY(window));
//cout << DCTY(window) << endl;
//cout << DCTY(window) << endl;
//DCTY(window) -= 127;
//cout << DCTY(window) << endl;
//DCTY(window) /= mask;
//cout << DCTY(window) << endl;
/*for (int j = 0; j < 4; j++)
{
ca = llroundf(DCTY.at<float>(j, 4 - j));
//cout << "ca:" << ca<<endl;
emb = PixelTransformation(ca, im.substr(imindex, 2));
//cout << "DCTYemb:" << emb << endl;
DCTY(window).at<float>(j, 4 - j) = (ca >= 0) ? emb : -emb;
//cout << "DCT.at:" << DCTY.at<float>(j, 3 - j + num) << " ";
imindex += 2;
}*/
//pixelPtr = DCTY.ptr<float>(0);
embits1=llroundf(DCTY(window).ptr<float>(0)[4]);
embits2=llroundf(DCTY(window).ptr<float>(1)[3]);
embits3=llroundf(DCTY(window).ptr<float>(2)[2]);
embits4=llroundf(DCTY(window).ptr<float>(3)[1]);
//cout << embits1 << " " << embits2 << " " << embits3 << " " << embits4<<endl;
emb1 = PixelTransformation(embits1, im.substr(0, 2));
emb2 = PixelTransformation(embits2, im.substr(2, 2));
emb3 = PixelTransformation(embits3, im.substr(4, 2));
emb4 = PixelTransformation(embits4, im.substr(6, 2));
//cout << emb1 << " " << emb2 << " " << emb3 << " " << emb4 << endl;
DCTY(window).ptr<float>(0)[4] = (embits1 >= 0) ? emb1 : -emb1;
DCTY(window).ptr<float>(1)[3] = (embits2 >= 0) ? emb2 : -emb2;
DCTY(window).ptr<float>(2)[2] = (embits3 >= 0) ? emb3 : -emb3;
DCTY(window).ptr<float>(3)[1] = (embits4 >= 0) ? emb4 : -emb4;
//cout << DCTY(window)<< endl;
//imindex = 0;
enindexY = (enindexX + 1 <= encols - 1) ? enindexY : enindexY + 1;
//cout << enindexY;
enindexX = (enindexX + 1 <= encols - 1) ? enindexX + 1 : 0;
enindexY = (enindexY + 1 <= enrows - 1) ? enindexY : 0;
Embedded = (int)en.at<uchar>(enindexY, enindexX);
_itoa_s(Embedded, embeddedbyte, 9, 2);
im = embeddedbyte;
im = todString(im);
idct(DCTY(window), DCTY(window));
}
}
DCTY.convertTo(iDCTY, CV_8UC1);
//imshow("iDCTY", iDCTY);
//waitKey(0);
Mat img[] = { iDCTY,srcU,srcV };
merge(img, 3, imgdst);
cvtColor(imgdst, imgdst2, COLOR_YUV2BGR);
//cvtColor(src, imgdst, COLOR_YUV2BGR);
//imshow("imgdst", imgdst2);
//imshow("src", src);
//waitKey(1);
writer.write(imgdst2);
}
/*
* 关闭解码器
*
*/
writer.release();
capture.release();
cout << "end" << endl;
}