【求助】用VedioWriter输出avi视频文件,视频却无法打开是为什么?

qq_41571940 2020-03-01 10:07:06
这个设计的思路是将一副图片嵌入视频中,先逐帧读取视频,对每一帧视频进行8X8dct变换,然后将要嵌入的像素X分为八位比特位,选四个中频系数嵌入,每次嵌入两个x1,x2。嵌入方法是将中频系数的载体像素Y提取后三位y1,y2,y3,分别异或y1^y2,y1^y3生成校验位c1,c1再与x1,x2异或会有四种结果,根据结果分别修改y1,y2,y3或者不改就是了。
当然这个不是重点.....重点是现在用opencv读取视频进行以上操作后输出avi文件,现在文件是输出了但是无法打开,是不是我哪里写错了?另外这个代码效率有点低,也请大神帮忙指点一下怎么改进效率谢谢。
代码如下:

#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;
}
...全文
450 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_41571940 2020-03-03
  • 打赏
  • 举报
回复
好吧打开视频文件的问题是解决了....但是又有了新的问题,我用.ptr方法访问并修改像素。结果视频倒是输出了,读取进来我修改的像素全还原根本没改......是我没写进去还是被视频压缩掉了?求助各位大神

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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