Opencv将处理后的视频保存出现的问题

问题描述:
代码运行过程中,imshow出来的每帧的效果图是正确的,但是按照网上的方法保存下来却是0kb,打开不了。
参考的网上的一些方法,均是失败的,具体原因我也不清楚:
1、例如我这样设置,会报这样的错:
错误
2、后来经过查找,这种表示方法更换成:

int outCompressCodec = CAP_OPENCV_MJPEG;// 设置要保存视频的格式。

这回不报错了,但是产生的视频文件仍然是为0kb;
3、
设置为和输入视频一样的格式:

int outCompressCodec = capture.get(CAP_PROP_FOURCC);

不报错,但是产生的视频文件仍然是为0kb;
4、还有不知道是那种操作,导致这样的提示:
程序运行的过程中面板上弹出的错误是:这个应该是涉及到编码与解码的库,但老实说不需要下载相关库,自带的也可以实现我所需要的功能的。

[ INFO:0] VIDEOIO: Enabled backends(5, sorted by priority): FFMPEG(1000); MSMF(990); DSHOW(980); CV_IMAGES(970); CV_MJPEG(960)Failed to load OpenH264 library: openh264-1.8.0-win64.dllPlease check environment and/or download library: https://github.com/cisco/openh264/releases[libopenh264 @ 00000232d8d77f00] Incorrect library version loaded
Could not open codec 'libopenh264': Unspecified error

5、最后发现原来按照CAP_OPENCV_MJPEG设置的话,输出的视频必须为MP4格式,我还傻逼呼呼地用avi格式,最终结果很好!!

这是我写的代码:(将avi输出为MP4)

#include <opencv2/opencv.hpp>
#include "opencv2/features2d.hpp"
#include<opencv2/highgui.hpp>
#include <iostream>
#include "windows.h"
#include <stdio.h>
#include <time.h>
#include <math.h>  
#include "My_ImageProssing_base.h"
#define WINDOW_NAME "【程序窗口】"			
using namespace cv;
using namespace std;
//RNG g_rng(12345);//失败//对视频进行动漫化一般需要四个步骤
//1、边缘检测
//2、将边缘检测得到的边缘 以黑色的形式贴在原来的画上。
//3、对贴了边缘的图进行双边滤波,双边滤波可以较好的滤波的同时保留边缘。
//4、修改图像的颜色的饱和度,本文采用的是将RGB转化为HSV空间,然后调整S分量。//*--------------------------【全局变量声明】-------------------------------------*/
int g_nThresholdValue = 71;	//canny参数值
int g_nkernelValue = 21;	//双边滤波核大小
int g_nS = 248;	//
Mat g_srcImage, g_grayImage,g_cannyImage,g_dstImage;void H_mul_k(Mat* srcImage, Mat* dstImage, float k)
{int height = (*srcImage).rows;int width = (*srcImage).cols;for (int j = 0; j < height; j++){for (int i = 0; i < width; i++){int zhi = (*srcImage).at<uchar>(j, i) * k;if (zhi >= 255) zhi = 255;else if (zhi <= 0) zhi = 0;else zhi = zhi;(*dstImage).at<uchar>(j, i) = zhi;}}
}
int main(int argc, char* argv[])
{Point pt1, pt2;Mat g_srcImage;cv::VideoCapture capture("D:\\opencv_picture_test\\毛概期中作业\\路上风景.avi");//关联读入视频文件if (!capture.isOpened()) {std::cout << "fail to load video";return 1;}/*获取视频fps*/double rate = capture.get(CAP_PROP_FPS);/*获取视频帧的尺寸*/int width = capture.get(CAP_PROP_FRAME_WIDTH);int height = capture.get(CAP_PROP_FRAME_HEIGHT);// 获取当前视频的编码格式,输出的视频要和输入视频编码相同才可以保存。//int outCompressCodec = capture.get(CAP_PROP_FOURCC);int outCompressCodec = CAP_OPENCV_MJPEG;// 设置要保存视频的格式。cout << outCompressCodec << endl;/*根据打开视频的参数初始化输出视频格式*///D:\\opencv_picture_test\\毛概期中作业\\re_video.avicv::VideoWriter w_cap("D:\\opencv_picture_test\\毛概期中作业\\re_video.mp4", outCompressCodec, rate, cv::Size(width, height),true);/*自定义输出视频的尺寸,需要将读取的视频帧尺寸进行变换,下文使用的resize函数完成*///cv::VideoWriter w_cap("re_video.avi", outCompressCodec, rate, cv::Size(width,height));/*循环读取视频的帧*/while (capture.read(g_srcImage)) {/****************************************************************************************************************************//*对读取的视频帧进行处理*/g_grayImage.create(g_srcImage.size(), g_srcImage.type());		//创建一个同大小类型的矩阵cvtColor(g_srcImage, g_grayImage, COLOR_BGR2GRAY);//imshow("【原图的灰度图】", g_grayImage);//进行均值滤波操作blur(g_grayImage, g_grayImage, Size(3, 3));//【4】创建滑动条来控制阈值//【1】运行canny算子Canny(g_grayImage, g_cannyImage, g_nThresholdValue, g_nThresholdValue / 3, 3);cv::Mat g_canny3Image(g_srcImage.rows, g_srcImage.cols, CV_8UC3, cv::Scalar(0, 0, 0));//【2】贴图//将canny图反转(将边缘变为黑色)Mat change_g_cannyImage;//change_g_cannyImage = g_cannyImage < 100;		//非边缘转化为255,边缘转化为0;非边缘会在之后的处理会变为透明,而边缘则会保持原有的数据0change_g_cannyImage = 255 - g_cannyImage;//将单通道转化为三通道cvtColor(change_g_cannyImage, g_canny3Image, COLOR_GRAY2BGR);//image.copyTo(imageROI,mask), 作用是把mask和image重叠以后把mask中像素值为0(black)的点对应的image中的点变为透明,而保留其他点。Mat bianyuan_dst;g_srcImage.copyTo(bianyuan_dst, g_canny3Image);//【3】双边滤波Mat lvbo_dst;bilateralFilter(bianyuan_dst, lvbo_dst, g_nkernelValue, g_nkernelValue * 2, g_nkernelValue / 2);//【4】修改图像的颜色的饱和度Mat hsv_image, hsv_dst;cvtColor(lvbo_dst, hsv_image, COLOR_BGR2HSV);vector<Mat> channels;split(hsv_image, channels);Mat S_Mat;float k = g_nS * 1.0f / 100;channels.at(1).copyTo(S_Mat);cv::Mat S_dst(S_Mat.rows, S_Mat.cols, CV_8UC1, cv::Scalar(0));//S_dst = S_Mat * k;H_mul_k(&S_Mat, &S_dst, k);//将修改后的S与原来的H,V进行mergechannels[1] = S_dst.clone();	//深复制merge(channels, hsv_dst);//将修改后的HSV转为RGB图Mat RGB_dst;cvtColor(hsv_dst, RGB_dst, COLOR_HSV2BGR);/****************************************************************************************************************************//*保存处理后的帧为视频*/w_cap.write(RGB_dst);//这里我们不展示//imshow("src", RGB_dst);if (waitKey(10)=='q'){break;}}capture.release();cout << "处理好了" << endl;return 0;
}

参考链接们:

opencv视频读取与帧处理后保存为视频的方法
利用opencv加快视频播放速度,并保存avi视频文件
opencv4.0.0里面CV_FOURCC找不到标识符
opencv VideoWriter保存视频失败原因
opencv视频保存
OpenCV视频写入详解_Python,视频保存0kb问题
解决c++ - openh264 - bEnableFrameSkip=0, bitrate can’t be controlled
常见的视频格式以及视频编解码标准(附带OpenCV实现视频的读取与保存)

十分感谢上面的链接!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java Number shortValue()方法与示例

Number类shortValue()方法 (Number Class shortValue() method) shortValue() method is available in java.lang package. shortValue()方法在java.lang包中可用。 shortValue() method is used to return the value denoted by this Number object converted to type short (…

MATLAB可以打开gms文件吗,gms文件扩展名,gms文件怎么打开?

.gms文件类型&#xff1a;Gesture and Motion Signal File扩展名为.gms的文件是一个数据文件。文件说明&#xff1a;Low-level, binary, minimal but generic format used to organize and store Gesture and Motion Signals in a flexible and optimized way; gesture-related…

黑白图片颜色反转并保存

将图像的黑白颜色反转并保存 import cv2 # opencv读取图像 img cv2.imread(rE:\Python-workspace\OpenCV\OpenCV/YY.png, 1) cv2.imshow(img, img) img_shape img.shape # 图像大小(565, 650, 3) print(img_shape) h img_shape[0] w img_shape[1] # 彩色图像转换为灰度图…

家猫WEB系统

现在只放源码在些.为它写应用很简单有空整理文档演示地址:jiamaocode.com/os/ 源码&#xff1a;http://jiamaocode.com/ProCts/2011/04/14/1918/1918.html转载于:https://www.cnblogs.com/jiamao/archive/2011/04/16/2018339.html

C# DataRow数组转换为DataTable

public DataTable ToDataTable(DataRow[] rows) { if (rows null || rows.Length 0) return null; DataTable tmp rows[0].Table.Clone(); // 复制DataRow的表结构 foreach (DataRow row in rows) tmp.Rows.Add(row); // 将DataRow添加…

plesk 运行不了php,如何在Plesk中使用composer(使用其他版本的PHP运行Composer)

对于基于Plesk的服务器, composer的默认安装将使用系统安装的PHP版本, 而不使用Plesk所安装的任何版本。尽管Composer至少需要PHP 5.3.2, 但是当你尝试在需要特定版本PHP的项目中安装依赖项时, 就会出现问题。例如, 如果你有一个至少需要PHP 7.2的项目, 并且系统的默认PHP安装是…

Java Calendar hashCode()方法与示例

日历类hashCode()方法 (Calendar Class hashCode() method) hashCode() method is available in java.util package. hashCode()方法在java.util包中可用。 hashCode() method is used to retrieve the hash code value of this Calendar. hashCode()方法用于检索此Calendar的哈…

Error: Flash Download failed - Target DLL has been cancelled

博主联系方式: QQ:1540984562 QQ交流群:892023501 群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。 由于换了新电脑,keil重装了下,然而之前的MCU的支持包没有安装,以及一些其他的问题,导致可以编译但是不能将程序烧录到单片…

设计一个较为合理的实验方案来研究芳纶纤维的染色热力学性能

请你设计一个较为合理的实验方案来研究芳纶纤维的染色热力学性能?包括吸附等温线、亲和力、染色热和染色熵的测定,并指出实验中应注意哪些事项来减少实验误差? 标准答案: 染色热力学理论研究染色平衡问题。研究染色热力学性能:首先研究选择适宜的染料 吸附等温线类型测定…

我也谈委托与事件

虽然在博客园里面已经有很多关于C#委托和事件的文章&#xff0c;但是为了自己在学习的过程中&#xff0c;加深对委托的理解&#xff0c;我还是决定写一下自己的心得体会。以备他日在回来复习。委托&#xff08;delegate&#xff09;是一个类&#xff0c;但是这个类在声明的时候…

php错误拦截机制,php拦截异常怎么写-PHP问题

php拦截异常可以通过PHP的错误、异常机制及其内建数set_exception_handler、set_error_handler、register_shutdown_function 来写。首先我们定义错误拦截类&#xff0c;该类用于将错误、异常拦截下来&#xff0c;用我们自己定义的处理方式进行处理&#xff0c;该类放在文件名为…

智能车复工日记【4】:关于图像的上下位机的调整问题总结

系列文章 【智能车Code review】—曲率计算、最小二乘法拟合 【智能车Code review】——坡道图像与控制处理 【智能车Code review】——拐点的寻找 【智能车Code review】——小S与中S道路判断 【智能车Code review】——环岛的判定与补线操作 智能车复工日记【1】——菜单索引…

设计合理的实验方案来研究阳离子改性棉织物与未改性棉的染色动力学性能

染色动力学性能研究染色的什么问题?设计合理的实验方案来研究阳离子改性棉织物与未改性棉的染色动力学性能?并指出如何计算反映染色动力学的主要参数? 标准答案: 染色动力学研究染色速率问题。 为了研究阳离子改性棉纤维及未改性棉纤维对活性染料染色动力学性能,首先要测…

Java ArrayList toArray()方法及示例

ArrayList类的toArray()方法 (ArrayList Class toArray() method) Syntax: 句法&#xff1a; public Object[] toArray();public T[] toArray(T[] elements);toArray() method is available in java.util package. toArray()方法在java.util包中可用。 toArray() method is us…

小练习:新闻网站、SNS网站图片播放器jQuery版

新闻网站和sns网站常见的图片浏览器。直接看效果吧&#xff0c;效果预览&#xff1a;http://u.vps168.com.cn/cos2004/photoView/&#xff0c; ie7、ie8、ff预览正常&#xff0c;ie6和chrome预览有一点小问题&#xff0c;研究中 作者&#xff1a;绿色花园 出处&#xff1a;htt…

SQL SERVER的锁机制(四)——概述(各种事务隔离级别发生的影响)

SQL SERVER的锁机制&#xff08;一&#xff09;——概述&#xff08;锁的种类与范围&#xff09; SQL SERVER的锁机制&#xff08;二&#xff09;——概述&#xff08;锁的兼容性与可以锁定的资源&#xff09; 本文上接SQL SERVER的锁机制&#xff08;三&#xff09;——概述&a…

如何测定拼色染液中,各染料在不同染色时间时,染液中残留染料量及织物上吸附上染的染料量?

如何测定拼色染液中,各染料在不同染色时间时,染液中残留染料量及织物上吸附上染的染料量? 标准答案: 通常依据各染料对特定波长光的吸光度具有加和性;吸光度值符合朗伯比尔定律,吸光度与浓度成正比;吸光度值分光光度计可以读出;通过联立方程,可以求出拼色各染料在染液中…

oracle云数据库 免费的吗,使用免费的Oracle云服务-创建ATP数据库

前面我们讲了在Oracle的云主机安装数据库&#xff0c;虽然现在安装数据库已经很简单了&#xff0c;但是真正要在生产环境使用&#xff0c;还是需要进行很多配置和优化的&#xff0c;这通常需要专业的人员。而ATP(自治事务性数据库服务)正是Oracle云提供的非常强大的数据库云服务…

golang判断结构体为空_如何在Golang中检查结构是否为空?

golang判断结构体为空The size of an empty structure is zero in Golang. Here, empty structure means, there is no field in the structure. 在Golang中&#xff0c; 空结构的大小为零。 在此&#xff0c; 空结构表示该结构中没有字段。 Eg: 例如&#xff1a; Type struc…

智能车复工日记【5】:起跑线的识别与车库入库

博主联系方式: QQ:1540984562 QQ交流群:892023501 群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。 系列文章 【智能车Code review】—曲率计算、最小二乘法拟合 【智能车Code review】——坡道图像与控制处理 【智能车Code re…