• #include "opencv2/core/core.hpp" #include "highgui.h" #include #include using namespace cv; using namespace std; class videoHandler{ public: static int playVideo(const string& filena
    #include "opencv2/core/core.hpp"
    #include "highgui.h"
    #include <iostream>
    #include <windows.h>
    using namespace cv;
    using namespace std;
    
    
    class videoHandler{
    public:
    	static int playVideo(const string& filename){
    		VideoCapture capture(filename);
    		if (!capture.isOpened()){
    			cout << "Error : video loaded failed" << endl;
    			return 0;
    		}
    		double rate = capture.get(CV_CAP_PROP_FPS);//获取帧率
    		Mat frame;
    		int delay = 1000 / rate;
    
    
    		while (capture.read(frame))
    		{
    			imshow("this is my girl", frame);
    			waitKey(delay);
    		}
    		capture.release();
    		return 1;
    	}
    
    
    	static int showCamera(){
    		VideoCapture capture(0);
    		if (!capture.isOpened()){
    			cout << "Error : camera loaded failed" << endl;
    			return 0;
    		}
    		Mat frame;
    
    		//----------这里有个坑,由于摄像头加载需要时间,所以务必要确保摄像头完全开启,再执行下面的动作
    		//摄像头延迟加载
    		while (true)
    		{
    			if (capture.read(frame))
    				break;
    			Sleep(10);
    		}
    
    		Size size(capture.get(CV_CAP_PROP_FRAME_WIDTH), capture.get(CV_CAP_PROP_FRAME_HEIGHT));
    		//----------这里有个坑,直接获取摄像头的帧率都是0,会导致保存下来的文件是空
    		VideoWriter write("theshow.avi", CV_FOURCC('D', 'I', 'V', 'X'), 20, size);
    		if (!write.isOpened())
    		{
    			cout << "Error : fail to open video writer\n" << endl;
    			return -1;
    		}
    		//逐帧读取视频
    		while (capture.read(frame))
    		{
    			imshow("load camera video", frame);
    			write.write(frame);//CV_WRAP virtual void write(const Mat& image);
    			if (waitKey(30) == VK_ESCAPE){//如果用户输入esc,就退出摄像头录制
    				break;
    			}
    		}
    		cout << "Success : theshow.avi saved successfully..." << endl;
    		capture.release();
    		write.release();
    		return 1;
    	}
    };

    展开全文
  • 学习了OpenCV,当然少不了会用来处理视频,这就需要用到视频编解码器。 配置环境 编解码器在解压的OpenCV 目录下就有。在opencv\build\bin 下 ​ 同样的,将这个文件放到 C:\Windows\System32 目录下。 测试代码 ...

    学习了OpenCV,当然少不了会用来处理视频,这就需要用到视频编解码器。

    配置环境

    编解码器在解压的OpenCV 目录下就有。在opencv\build\bin
    在这里插入图片描述

    同样的,将这个文件放到 C:\Windows\System32 目录下。
    在这里插入图片描述

    测试代码

    这里需要一个视频文件,如果你电脑正好没有,没关系,OpenCV 为你准备好了。

    视频文件

    打开解压的 OpenCV 目录。找到opencv\sources\samples\data。这里放的是官方示例的图片视频资源。滚动条往下拉,到最底部,能找到一个vtest.avi,好,就它了。
    在这里插入图片描述
    将这个视频文件复制到D:\test 下方便使用。
    在这里插入图片描述

    代码

    import org.opencv.core.Core;
    import org.opencv.core.Mat;
    import org.opencv.highgui.HighGui;
    import org.opencv.videoio.VideoCapture;
    
    public class Test {	
    	public static void main(String[] args) {
    		System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    		VideoCapture capture = new VideoCapture();
    		capture.open("D:\\test\\vtest.avi");//打开视频文件
    		if(!capture.isOpened()) { // 判断视频文件是否存在
    			System.out.println("视频文件路径错误!");
    			return;
    		}
    		
    		HighGui.namedWindow("show");// 创建一个窗口,用来播放视频,窗口通过名字来区分,所以必须要命名。
    		Mat image = new Mat();//定义一个Mat,用来接收一帧的图像
    		
    		while(capture.read(image)) {// capture.read(image) 接收视频一帧的图像,将它存放在 image 中。如果视频中没有图像,即视频读取完毕,则返回 false
    			HighGui.imshow("show", image);// 第一个参数:要在哪个窗口显示   第二个参数:要显示的 Mat 
    			HighGui.waitKey(30); //每一帧之间的播放间隔
    		}
    		System.out.println("播放完毕");
    		HighGui.destroyAllWindows();//销毁所有创建的窗口
    		System.exit(0);// 程序停止
    	}
    }
    

    运行效果
    在这里插入图片描述

    展开全文
  • OpenCV Jpeg编解码

    2014-07-10 11:00:27
    源码来自:https://code.google.com/p/opencvjp-sample/source/browse/trunk/cpp/encode_decode_test.cpp?r=63 此文主要miao

    源码来自:https://code.google.com/p/opencvjp-sample/source/browse/trunk/cpp/encode_decode_test.cpp?r=63

    描述:描述读取一张图片进行jpg和png压缩,并解压显示。

    主要函数:imencode和imdecode。

    环境:windows7+vs2010+opencv2.4.8。

    工程地址:http://download.csdn.net/detail/chengkun183/7609491

    源码:

    // JPEGDecodeEncode.cpp : 定义控制台应用程序的入口点。
    
    #include "stdafx.h"
    #include <iostream>
    #include <fstream>
    #include <cv.h>
    #include <highgui.h>
    using namespace std;
    using namespace cv;
    
    double getPSNR(Mat& src1, Mat& src2, int bb=0);
    
    int main(int argc, char** argv)
    {
    	Mat src = imread("lena.png");
    	cout<<"origin image size: "<<src.dataend-src.datastart<<endl;
    	cout<<"height: "<<src.rows<<endl<<"width: "<<src.cols<<endl<<"depth: "<<src.channels()<<endl;
    	cout<<"height*width*depth: "<<src.rows*src.cols*src.channels()<<endl<<endl;
    	//(1) jpeg compression
    	vector<uchar> buff;//buffer for coding
    	vector<int> param = vector<int>(2);
    	param[0]=CV_IMWRITE_JPEG_QUALITY;
    	param[1]=95;//default(95) 0-100
    
    	imencode(".jpg",src,buff,param);
    	cout<<"coded file size(jpg): "<<buff.size()<<endl;//fit buff size automatically.
    	Mat jpegimage = imdecode(Mat(buff),CV_LOAD_IMAGE_COLOR);
    
    	//(2) png compression
    	param[0]=CV_IMWRITE_PNG_COMPRESSION;
    	param[1]=3;//default(3)  0-9.
    	imencode(".png",src,buff,param);
    	cout<<"coded file size(png): "<<buff.size()<<endl;
    	Mat pngimage = imdecode(Mat(buff),CV_LOAD_IMAGE_COLOR);
    
    	//(3) intaractive jpeg compression
    	char name[64];
    	namedWindow("jpg");
    	int q=95;
    	createTrackbar("quality","jpg",&q,100);
    	int key = 0;
    	while(key!='q')
    	{
    		param[0]=CV_IMWRITE_JPEG_QUALITY;
    		param[1]=q;
    		imencode(".jpg",src,buff,param);
    		Mat show = imdecode(Mat(buff),CV_LOAD_IMAGE_COLOR);
    
    		double psnr = getPSNR(src,show);//get PSNR
    		double bpp = 8.0*buff.size()/(show.size().area());//bit/pixe;
    		sprintf(name,"quality:%03d, %.1fdB, %.2fbpp",q,psnr,bpp);
    		putText(show,name,Point(15,50), FONT_HERSHEY_SIMPLEX,1,CV_RGB(255,255,255),2);
    		imshow("jpg",show);
    		key = waitKey(33);
    
    		if(key =='s')
    		{
    			//(4) data writing 
    			sprintf(name,"q%03d_%.2fbpp.png",q,bpp);
    			imwrite(name,show);
    
    			sprintf(name,"q%03d_%.2fbpp.jpg",q,bpp);
    			param[0]=CV_IMWRITE_JPEG_QUALITY;
    			param[1]=q;
    			imwrite(name,src,param);;
    		}
    	}
    }
    double getPSNR(Mat& src1, Mat& src2, int bb)
    {
    	int i,j;
    	double sse,mse,psnr;
    	sse = 0.0;
    
    	Mat s1,s2;
    	cvtColor(src1,s1,CV_BGR2GRAY);
    	cvtColor(src2,s2,CV_BGR2GRAY);
    
    	int count=0;
    	for(j=bb;j<s1.rows-bb;j++)
    	{
    		uchar* d=s1.ptr(j);
    		uchar* s=s2.ptr(j);
    
    		for(i=bb;i<s1.cols-bb;i++)
    		{
    			sse += ((d[i] - s[i])*(d[i] - s[i]));
    			count++;
    		}
    	}
    	if(sse == 0.0 || count==0)
    	{
    		return 0;
    	}
    	else
    	{
    		mse =sse /(double)(count);
    		psnr = 10.0*log10((255*255)/mse);
    		return psnr;
    	}
    }
    
    使用的图片为lena.png:


    输出的信息:



    展开全文
  • 图像编码为bytes import cv2 # 指定编码为JPEG格式的,要和图片存储的格式一致 img_encode = cv2.imencode('.jpg', img)[1] data_encode = np.array(img_encode) str_encode = data_encode.tostring() ...

    图像编码为bytes

    import cv2
    
    # 指定编码为JPEG格式的,要和图片存储的格式一致
    img_encode = cv2.imencode('.jpg', img)[1]
    data_encode = np.array(img_encode)  
    str_encode = data_encode.tostring()
    
    with open('img_encode.txt', 'w') as f:
        f.write(str_encode)
    

    读取bytes文件为图像

    import cv2
    
    with open('img_encode.txt', 'r') as f:
        str_encode = f.read()
    
    str_array = np.fromstring(str_encode, np.uint8)
    image = cv2.imdecode(str_array, cv2.IMREAD_COLOR)
    
    cv2.imshow("", image)
    cv2.waitKey(5000)
    
    展开全文
  • 首先base64,了解一下:Base64就是一种...或者先对base64字符串进行解码,然后再把二进制数据转化为图片保存或展示。 流程 编码 cv::Mat图片 -&gt; 二进制数据 bool imencode(const string&amp...

    首先base64,了解一下:Base64就是一种基于64个可打印字符来表示二进制数据的方法。
    表示二进制数,所以我得先让图片转化为二进制数据,然后对二进制数据进行base64编码;
    或者先对base64字符串进行解码,然后再把二进制数据转化为图片保存或展示。

    流程

    • 编码
      1. cv::Mat图片 -> 二进制数据
    bool imencode(const string& ext, InputArray img, vector& buf, const vector& params=vector())
    //ext:  图片后缀名,如".jpg"或".png"
    //img:  需要进行相关操作的图片
    //buf:  输出二进制数据到该缓存。
    
    //params:格式相关的参数
    //params中的每个参数成对出现,即paramId_1, paramValue_1, paramId_2, paramValue_2, … ,当前支持如下参数:
    //JPEG:压缩质量 ( CV_IMWRITE_JPEG_QUALITY ),从0到100(数值越高质量越好),默认值为95。
    //PNG:  compression level ( CV_IMWRITE_PNG_COMPRESSION ) 从0到9。 数值越高,文件大小越小,压缩时间越长。默认值为3。
    //PPM,  PGM, or PBM:二进制标志 ( CV_IMWRITE_PXM_BINARY ),0 或 1。默认值为1。

    2.二进制数据 -> base64字符串
    网上有很多的 base64编解码 源码,本文末会添加我使用的源码供参考。


    附:

    /*****test.cpp*****/
    #include <iostream>
    #include <opencv.hpp>
    #include <vector>
    #include <fstream>
    #include "base64.h"
    using namespace cv;
    using namespace std;
    void write(string encode_str);
    string read(string fileName);
    string encode();
    Mat decode();
    
    int main() {    
        Mat img = decode();
        imshow("test", img);
        if (waitKey(1) == 27)
            return 0;
        system("pause");
        return 0;
    }
    
    /***编码得到的 base64字符串 写入 “base64_str” 保存***/
    void write(string encode_str)
    {
        ofstream out;
        out.open("base64_str", ios::out | ios::trunc);
        out << encode_str << endl;
        out.close();
    }
    
    /***读取指定文件保存的 base64 字符串并返回***/
    string read(string fileName)
    {
        string base64_str;
        ifstream in;
        in.open(fileName, ios::in);
        in >> base64_str;
        cout << "base64_str.length() = " << base64_str.length() << endl;
        in.close();
        return base64_str;
    }
    
    /***编码***/
    string encode()
    {
        string img_path("img.jpg");
        Mat img;
        img = imread(img_path);
        if (img.empty())
        {
            cout << "img is empty" << endl;
            return "Failed";
        }
    
        vector<uchar> img_data;
        imencode(".jpg", img, img_data);
        string str_Encode(img_data.begin(), img_data.end());
        write(str_Encode);
    }
    
    /***解码***/
    Mat decode()
    {
        string encode_str = read("dog.base");
        string decode_str;
    
        //这里可以看到,我调用的第三方库支持std::string类的参数形式
        Base64::Decode(encode_str, &decode_str);
        vector<uchar> img_data(decode_str.begin(), decode_str.end());
        Mat img = imdecode(Mat(img_data), CV_LOAD_IMAGE_COLOR);
        return img;
    }

    关于base64解码,碰到一个问题:
    借助在线编码器,将以下图片:
    这里写图片描述
    转为base64字符串:
    data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGB。。。。。。。。。
    如果需要解析字符串,加粗部分需要删除,在未删除时,执行程序提示:
    这里写图片描述
    删除后,运行正常:
    这里写图片描述


    刚刚发现csdn下载如果上传资源不能免费 0.0

    /*****base64.h*****/
    #ifndef BASE64_H
    #define BASE64_H
    
    #include <string>
    
    const char kBase64Alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    "abcdefghijklmnopqrstuvwxyz"
    "0123456789+/";
    
    class Base64 {
    public:
        static bool Encode(const std::string &in, std::string *out) {
            int i = 0, j = 0;
            size_t enc_len = 0;
            unsigned char a3[3];
            unsigned char a4[4];
    
            out->resize(EncodedLength(in));
    
            int input_len = in.size();
            std::string::const_iterator input = in.begin();
    
            while (input_len--) {
                a3[i++] = *(input++);
                if (i == 3) {
                    a3_to_a4(a4, a3);
    
                    for (i = 0; i < 4; i++) {
                        (*out)[enc_len++] = kBase64Alphabet[a4[i]];
                    }
    
                    i = 0;
                }
            }
    
            if (i) {
                for (j = i; j < 3; j++) {
                    a3[j] = '\0';
                }
    
                a3_to_a4(a4, a3);
    
                for (j = 0; j < i + 1; j++) {
                    (*out)[enc_len++] = kBase64Alphabet[a4[j]];
                }
    
                while ((i++ < 3)) {
                    (*out)[enc_len++] = '=';
                }
            }
    
            return (enc_len == out->size());
        }
    
        static bool Encode(const char *input, size_t input_length, char *out, size_t out_length) {
            int i = 0, j = 0;
            char *out_begin = out;
            unsigned char a3[3];
            unsigned char a4[4];
    
            size_t encoded_length = EncodedLength(input_length);
    
            if (out_length < encoded_length) return false;
    
            while (input_length--) {
                a3[i++] = *input++;
                if (i == 3) {
                    a3_to_a4(a4, a3);
    
                    for (i = 0; i < 4; i++) {
                        *out++ = kBase64Alphabet[a4[i]];
                    }
    
                    i = 0;
                }
            }
    
            if (i) {
                for (j = i; j < 3; j++) {
                    a3[j] = '\0';
                }
    
                a3_to_a4(a4, a3);
    
                for (j = 0; j < i + 1; j++) {
                    *out++ = kBase64Alphabet[a4[j]];
                }
    
                while ((i++ < 3)) {
                    *out++ = '=';
                }
            }
    
            return (out == (out_begin + encoded_length));
        }
    
        static bool Decode(const std::string &in, std::string *out) {
            int i = 0, j = 0;
            size_t dec_len = 0;
            unsigned char a3[3];
            unsigned char a4[4];
    
            int input_len = in.size();
            std::string::const_iterator input = in.begin();
    
            out->resize(DecodedLength(in));
    
            while (input_len--) {
                if (*input == '=') {
                    break;
                }
    
                a4[i++] = *(input++);
                if (i == 4) {
                    for (i = 0; i < 4; i++) {
                        a4[i] = b64_lookup(a4[i]);
                    }
    
                    a4_to_a3(a3, a4);
    
                    for (i = 0; i < 3; i++) {
                        (*out)[dec_len++] = a3[i];
                    }
    
                    i = 0;
                }
            }
    
            if (i) {
                for (j = i; j < 4; j++) {
                    a4[j] = '\0';
                }
    
                for (j = 0; j < 4; j++) {
                    a4[j] = b64_lookup(a4[j]);
                }
    
                a4_to_a3(a3, a4);
    
                for (j = 0; j < i - 1; j++) {
                    (*out)[dec_len++] = a3[j];
                }
            }
    
            return (dec_len == out->size());
        }
    
        static bool Decode(const char *input, size_t input_length, char *out, size_t out_length) {
            int i = 0, j = 0;
            char *out_begin = out;
            unsigned char a3[3];
            unsigned char a4[4];
    
            size_t decoded_length = DecodedLength(input, input_length);
    
            if (out_length < decoded_length) return false;
    
            while (input_length--) {
                if (*input == '=') {
                    break;
                }
    
                a4[i++] = *(input++);
                if (i == 4) {
                    for (i = 0; i < 4; i++) {
                        a4[i] = b64_lookup(a4[i]);
                    }
    
                    a4_to_a3(a3, a4);
    
                    for (i = 0; i < 3; i++) {
                        *out++ = a3[i];
                    }
    
                    i = 0;
                }
            }
    
            if (i) {
                for (j = i; j < 4; j++) {
                    a4[j] = '\0';
                }
    
                for (j = 0; j < 4; j++) {
                    a4[j] = b64_lookup(a4[j]);
                }
    
                a4_to_a3(a3, a4);
    
                for (j = 0; j < i - 1; j++) {
                    *out++ = a3[j];
                }
            }
    
            return (out == (out_begin + decoded_length));
        }
    
        static int DecodedLength(const char *in, size_t in_length) {
            int numEq = 0;
    
            const char *in_end = in + in_length;
            while (*--in_end == '=') ++numEq;
    
            return ((6 * in_length) / 8) - numEq;
        }
    
        static int DecodedLength(const std::string &in) {
            int numEq = 0;
            int n = in.size();
    
            for (std::string::const_reverse_iterator it = in.rbegin(); *it == '='; ++it) {
                ++numEq;
            }
    
            return ((6 * n) / 8) - numEq;
        }
    
        inline static int EncodedLength(size_t length) {
            return (length + 2 - ((length + 2) % 3)) / 3 * 4;
        }
    
        inline static int EncodedLength(const std::string &in) {
            return EncodedLength(in.length());
        }
    
        inline static void StripPadding(std::string *in) {
            while (!in->empty() && *(in->rbegin()) == '=') in->resize(in->size() - 1);
        }
    
    private:
        static inline void a3_to_a4(unsigned char * a4, unsigned char * a3) {
            a4[0] = (a3[0] & 0xfc) >> 2;
            a4[1] = ((a3[0] & 0x03) << 4) + ((a3[1] & 0xf0) >> 4);
            a4[2] = ((a3[1] & 0x0f) << 2) + ((a3[2] & 0xc0) >> 6);
            a4[3] = (a3[2] & 0x3f);
        }
    
        static inline void a4_to_a3(unsigned char * a3, unsigned char * a4) {
            a3[0] = (a4[0] << 2) + ((a4[1] & 0x30) >> 4);
            a3[1] = ((a4[1] & 0xf) << 4) + ((a4[2] & 0x3c) >> 2);
            a3[2] = ((a4[2] & 0x3) << 6) + a4[3];
        }
    
        static inline unsigned char b64_lookup(unsigned char c) {
            if (c >= 'A' && c <= 'Z') return c - 'A';
            if (c >= 'a' && c <= 'z') return c - 71;
            if (c >= '0' && c <= '9') return c + 4;
            if (c == '+') return 62;
            if (c == '/') return 63;
            return 255;
        }
    };
    
    #endif // BASE64_H

    参考:OpenCV学习笔记(一):读取、显示、保存图片

    展开全文
  • opencv 编码解码

    2019-09-20 11:41:55
    cv::imdecode 数据流解码成Mat demo int main() { cv::Mat src = cv::imread("E:\\Windowstest\\ConsoleApplication4\\ycy.jpg", 1); cv::Mat dst; std::vector <unsigned char> img_d...
  • OpenCV图像编码和解码

    2014-05-08 11:09:54
    内存图片二进制数据直接转为 OpenCV 数据格式的方法 Filed Under (技术) by waterlin 在很多应用中,经常会直接把图片的二进制数据进行交换,比如说利用 socket 通信传送图片二进制数据,或者直接用内存...
  • VideoCapture captRefrnc(“Megamind.avi")  ||  \/ /*cap.cpp文件*/ CV_IMPL CvCapture * cvCreateFileCapture (const char * filename) {  CvCapture * result = 0;
  • opencv jpeg 编解码

    2020-06-06 23:30:28
    对图像进行压缩编码,并写入内存,然后从内存中读出并显示
  • 1. 问题介绍:最近在2080ti上做实时视频流的模型...(1)软件解码是通过软件本身占用的CPU进行解码,所以会增加CPU工作负荷,提升功耗。软解由于加大CPU工作负荷,会占用过多的移动CPU资源,如果CPU能力不足,则软件
  • Opencv 实现GPU解码

    2018-11-07 15:37:36
    Opencv 实现GPU解码 最近一直关注使用GPU解码视频方面的工作。OpenCV已经实现了GPU解码的功能,本文将介绍一下如何使用OpenCV进行GPU解码,可能遇到的BUGs和解码速度分析。 实验环境:Ubuntu 16.04, Nvidia K40, ...
  • OpenCV视频解码

    2011-12-15 22:03:22
    OpenCV在读取摄像头和视频文件时, 需要安装解码器。 所用解码器是K-Lite Code Pack,在华军软件中下载。 针对于《Learning OpenCV》教程中的ch2_ex2_10.cpp例子运行成功。 网址:...
  • opencv视频解码

    2020-07-13 23:31:19
    opencv视频解码
  • 如果只是使用硬解码模块的话,需要使用Cmake从源码重新编译opencv,但是不需要使用contrib模块,因为硬解码部分包含在原始的opencv内部。 Cmake编译时需要:参考自...
  • 文档:opencv4.2.0 GPU视频编解码 CUDA10.1 ffmpeg全攻略 适合使用RTSP协议采集IPC摄像头以及H265 GPU 视频编解码 链接:http://note.youdao.com/noteshare?id=700052b0a49301059a34f20a00a830ca&sub=FE3784B3E...
  • opencv 作为一个图像处理库,对视频方面采取了一些简单的方法封装。OpenCV只支持avi的格式,而且生成的视频文件不能大于2GB,而且不能添加音频。videocapture 打开摄像头参数为0时打开默认的摄像头。vediowriter是对...
  • 编解码器5. 压缩系统的组成6. 编解码器的实现7. 视频编码标准8. 视频传输9. 视频传输面临的问题10. 视频传输差错控制11. 视频传输的QoS参数二、数字视频1. 图像与视频2. 数字视频3. 空间采样4. 数字视频系统5. 人类...
  • opencv2.4.9的lib链接库 realse opencv_calib3d249.lib opencv_contrib249.lib opencv_core249.lib opencv_features2d249.lib opencv_flann249.lib opencv_gpu249.lib opencv_highgui249.lib opencv_imgproc249....
  • ffmpeg4.0+OpenCV+VS2017 H264编解码示例。已经配置好环境,不需要再进行配置
  • 问题描述:项目中,需要对高清监控视频分析处理,经测试,其解码过程所占CPU资源较多,导致整个系统处理效率不高,解码成为系统的瓶颈。 解决思路: 利用GPU解码高清视频,降低解码所占用CPU资源,加速解码过程。 ...
1 2 3 4 5 ... 20
收藏数 3,719
精华内容 1,487
热门标签