精华内容
下载资源
问答
  • 读取视频 VideoCapture cap; //视频路径 cap.open("test.mp4"); //如果视频不能正常打开则返回 if (!cap.isOpened()) { cout <... //定义当前 frame_key=currentFrame long currentFr

    读取视频

        VideoCapture cap;
    	//视频路径
    	cap.open("test.mp4");
    	//如果视频不能正常打开则返回
    	if (!cap.isOpened())
    	{
    		cout << "cannot open video!" << endl;
    		return 0;
    	}
    	Mat frame_key;
    	cap >> frame_key;
    	//定义当前帧  frame_key=currentFrame
    	long currentFrame = 1;
    	if (frame_key.empty())
    		cout << "frame_key is empty!" << endl;
    	//显示视频
    	imshow("fram_1", frame_key);
    	waitKey(20);
    	//把第一帧写入关键帧
    	stringstream str;
    	str << "./keyframe/" << currentFrame << ".jpg";
    	imwrite(str.str(), frame_key);
    

    定义一个循环,使得前一帧和当前帧进行对比

    while (1)
    	{
    	    //定义后一帧  frame=currentFrame+1
    		currentFrame++;
    		Mat frame;
    		cap >> frame;
    		if (frame.empty())
    		{
    			//cout << "frame is empty!" << endl;
    			break;
    		}
    		waitKey(20);
    		Mat srcImage_base;
    		Mat srcImage_test1;
    		srcImage_base = frame_key;
    		srcImage_test1 = frame;
            
    		Mat previousImage, currentImage, resultImage;
    		//将图像从BGR色彩空间转换到 HSV色彩空间
    		cvtColor(srcImage_base, previousImage, COLOR_BGR2GRAY);
    		cvtColor(srcImage_test1, currentImage, COLOR_BGR2GRAY);
    		//帧差法,相减
    		absdiff(currentImage, previousImage, resultImage);  
    		//二值化,像素值相差大于20则置为255,其余为0。可以通过改变像素差值来调整视频关键帧
    		threshold(resultImage, resultImage, 10, 255.0, THRESH_BINARY); 
    
    		
    		float counter = 0, num = 0;
    		// 统计两帧相减后图像素
    		for (int i = 0; i < resultImage.rows; i++)
    		{
    			//获取每一行的指针
    			uchar *data = resultImage.ptr<uchar>(i); 
    			for (int j = 0; j < resultImage.cols; j++)
    			{
    				//计算总像素个数
    				num = num + 1;
    				//访问到像素值
    				if (data[j] == 255) 
    				{
    					//计算像素值变化的像素个数
    					counter = counter + 1;
    				}
    			}
    		}
    		//p设置的阈值
    		float p;
    		p = counter / num;
    		//阈值大于0.55是关键帧
    		if (p > 0.55) 
    		{
    			frame_key = frame;
    			cout << "正在写第" << currentFrame << "帧" << endl;
    			//写入关键帧
    			stringstream str;
    			str << "./keyframe/" << currentFrame << ".jpg";
    			imwrite(str.str(), frame_key);
    		}
    	}
    

    完整代码项目

    展开全文
  • #include<opencv2/opencv.hpp> #include<iostream> using namespace std; using namespace cv; int main() { Mat img=imread("f:/1.jpg"); int height=img.rows; int width=img.cols; ...
    #include<opencv2/opencv.hpp>
    #include<iostream>
    using namespace std;
    using namespace cv;
    int main()
    {
        Mat img=imread("f:/1.jpg");
        int height=img.rows;
        int width=img.cols;
        for(int i=0;i<height;i++)
        {
            unsigned char *data=img.data+i*width*img.channels();
            for(int j=0;j<width;j++)
            {
                int r=*(data+j*img.channels());
                int g=*(data+j*img.channels()+1);
                int b=*(data+j*img.channels()+2);
                cout<<r<<" "<<g<<" "<<b<<endl;
            }
        }        
        img.release();
        system("pause");
        return 1;
    }

     

     

    #include "WangSetup.h"
     
    #include <iostream>
    #include <cv.h>
    #include <highgui.h>
     
    using namespace std;
     
    int main()
    {
        //C++ Format
        cv::Mat img = cv::imread("lena.jpg");
        //取img中(30, 20)这个像素点的bgr信息
        cv::Vec3b bgr = img.at<cv::Vec3b>(30, 20);
        cout << "B: " << (unsigned int)bgr.val[0] << ", ";
        cout << "G: " << (unsigned int)bgr.val[1] << ", ";
        cout << "R: " << (unsigned int)bgr.val[2] << endl;
     
     
        //C Format
        IplImage *img2 = cvLoadImage("lena.jpg");        //8UC3, (0,0)B, (0,0)G, (0,0)R, (0,1)B, ...
        char *ptr = img2->imageData       //图像首地址
            + img2->widthStep * 30        //每行大小 * 行数
            + 3 * 20;                    //BGR占3个大小空间 * 列数
        printf("B: %d, G: %d, R: %d\n", (uchar)ptr[0], (uchar)ptr[1], (uchar)ptr[2]);
        cvReleaseImage(&img2);
         
        return 0;
    }

     

    CvScalar s;
    s = cvGet2D(src, j,i);//获取src图像中坐标为(i,j)的像素点的值
    s.val[0] 代表src图像BGR中的B通道的值~

     

    展开全文
  • OpenCV读取视频

    2019-01-26 22:20:22
    例子来源于Learning OpenCV 3 // video.cpp #include &amp;amp;amp;amp;amp;amp;amp;lt;iostream&amp;amp;amp;amp;amp;amp;amp;gt; #include &amp;amp;amp;amp;amp;amp;quot;opencv2/highgui/...

    例子来源于Learning OpenCV 3

    // video.cpp
    #include <iostream>
    
    #include "opencv2/highgui/highgui.hpp"
    #include "opencv2/imgproc/imgproc.hpp"
    
    int main( int argc, char **argv) {
    
    	// 创建了一个名为video的窗口用来显示帧
        cv::namedWindow("video", cv::WINDOW_AUTOSIZE);
        cv::VideoCapture cap;
        
        // 读取视频文件
        cap.open(std::string(argv[1]));
        
        cv::Mat frame;
        while (true) {
    		//std::cout << "display..." << std::endl;
    		// 按帧读取
    		cap >> frame;
            if (frame.empty())	
            	break;
    		cv::imshow("video", frame);
    		if (cv::waitKey(33) >= 0)	
    			break;
        }
        //std::cout << "End..." << std::endl;
        return 0;
    }
    

    程序首先创建一个播放窗口:

    cv::namedWindow("video", cv::WINDOW_AUTOSIZE);
    

    其原型如下:

    void cv::namedWindow ( const String & winname, int flags = WINDOW_AUTOSIZE )

    第一个参数是自定义的窗口名称,相当于是窗口ID,可通过这个ID来调用该窗口。如果已有同名窗口存在,则该函数不起作用。

    第二个参数是标志位。WINDOW_AUTOSIZE表示窗口自适应图片尺寸,不可手动调整。
    其他可用标志有:
    WINDOW_NORMAL:允许用户调整窗口大小。(不过我发现把当前正在运行的窗口关闭,如果视频文件未播放完毕,就会新打开一个窗口接着播放,此时窗口已无法再调整大小,目前暂不清楚原因)
    WINDOW_FREERATIO:调整窗口时允许图片不按原比例缩放
    WINDOW_KEEPRATIO:调整窗口大小时,图片按原比例缩放
    WINDOW_GUI_NORMAL:不带状态栏和工具栏的普通窗口
    WINDOW_GUI_EXPANDED:带状态栏和工具栏的扩展窗口
    默认情况下,标志位的值为WINDOW_AUTOSIZE|WINDOW_KEEPRATIO|WINDOW_GUI_EXPANDED

    接着实例化一个VideoCapture对象读取视频

    cap.open(std::string(argv[1]));
    

    函数原型

    virtual bool cv::VideoCapture::open ( const String & filename )

    该方法会先调用VideoCapture::release关闭已打开的文件。
    最后显示读取的图片

    cv::imshow("video", frame);
    

    函数原型

    void cv::imshow ( const String & winname, InputArray mat )

    第一个参数为所要播放图片的窗口的ID,对应前面cv::namedWindow()指定的窗口ID。如果该窗口没有被创建,则创建一个带WINDOW_AUTOSIZE标志的窗口。
    第二个参数是所要播放的图片对象,对应这个例子里视频的帧
    需要注意的是,要使imshow()能够显示出帧,还必须添加cv::waitKey()函数,其函数原型为:

    int cv::waitKey ( int delay = 0 )

    参数delay表示等待时长,如果该参数大于0,表示等待时长不小于delay毫秒,如果没有键盘时间发生;如果参数小于0,则函数会一直等待直至有键盘事件发生。这里设置延时33ms(播放似乎有些卡顿?修改成10ms似乎也是如此?待后续考查。)如果当前没有已激活的窗口,则该函数不起作用。

    下面对上述例子进行修改,尝试给视频添加进度条,并允许用户暂停和播放视频

    #include <iostream>
    
    #include "opencv2/highgui/highgui.hpp"
    #include "opencv2/imgproc/imgproc.hpp"
    
    cv::VideoCapture g_cap;
    // 记录当前已播放的帧数,显示为进度条当前位置。
    int g_slider_position = 0;
    
    // g_run用来记录和控制播放状态
    int g_run = 1;
    int g_dontset = 0; //start out in single step mode
    
    void onTrackbarSlide(int pos, void *) {
        g_cap.set(cv::CAP_PROP_POS_FRAMES, pos);
        
        // 如果用户手动调节了进度条,则播放模式置为暂停
        if (!g_dontset) {	
    	g_run = 1;
        }
        g_dontset = 0;
    }
    
    int main(int argc, char **argv) {
        cv::namedWindow("video", cv::WINDOW_AUTOSIZE);
        //cv::VideoCapture cap;
        g_cap.open(std::string(argv[1]));
        int frames = (int)g_cap.get(cv::CAP_PROP_FRAME_COUNT);
        int tmpw = (int)g_cap.get(cv::CAP_PROP_FRAME_WIDTH);
        int tmph = (int)g_cap.get(cv::CAP_PROP_FRAME_HEIGHT);
        std::cout << "Video has " << frames << " frames of dimensions("
    		<< tmpw << ", " << tmph << ")." << std::endl;
    
        cv::createTrackbar("Position", "video", &g_slider_position, 
    			frames, onTrackbarSlide);
    
        cv::Mat frame;
        while (true) {
    		//cap >> frame;
    		//if (frame.empty())
    		//    break;
    		//cv::imshow("video", frame);
    		//if (cv::waitKey(33) >= 0)
    		//    break;
    	
    		if (g_run != 0) {
    	   	 int cur_pos;
    		    g_cap >> frame;
    		    if (frame.empty()) 
    				break;
    		    cur_pos = (int)g_cap.get(cv::CAP_PROP_POS_FRAMES);
    		    g_dontset = 1;
    
    		    cv::setTrackbarPos("Position", "video", cur_pos);
    		    cv::imshow("video", frame);
    		    g_run -= 1;
    		} 
    
    		char c = (char)cv::waitKey(10);
    		if (c == 's') { // single step
    		    g_run = 1;
    	   	 std::cout << "Single step, run = " << g_run << std::endl;
            }
            if (c == 'r') { // run mode
    	 	   g_run = -1;
    	 	   std::cout << "Run mode, run = " << g_run << std::endl;
        	}
            if (c == 27) 
    	    break;
        }
        std::cout << "End..." << std::endl;
        return 0;
    }
    

        和上一个例子一样,程序首先创建了名为 video 的窗口,用来播放视频,接着读入视频文件。通过调用get()来获取视频文件的属性数据,其函数原型为:

    virtual double cv::VideoCapture::get ( int propId) const

        传入参数为相关属性标识符,支持获取的属性列表可以点击这里;这里分别获取了视频包含的总帧数cv::CAP_PROP_FRAME_COUNT、每一帧的宽度cv::CAP_PROP_FRAME_WIDTH及高度cv::CAP_PROP_FRAME_HEIGTH
      类似的还有上方onTrackbarSlide函数中的set(int propId, double value),用于设定指定属性的值。

        在当前窗口创建名为Position的进度条:

    cv::createTrackbar("Position", "video", &g_slider_position, 
    			frames, onTrackbarSlide);
    

    其函数原型为:

    int cv::createTrackbar (
       const String &trackbarname,
       const String &winname,
       int *value,
       int count,
       TrackbarCallback onChange = 0,
       void *userdata = 0
    )

      trackbarname指定创建的进度条的名称,同窗口的ID一样,可以通过指定进度条名称来指定要操作的进度条。
      winname指定进度条所在的窗口ID。
      value指定滑块的初始位置。
      count进度条的最大位置,这里为传入的视频的总帧数(最小位置总是为0)。
      onChange回调函数,一旦滑块的位置发生变化,就会调用回调函数。该回调函数的原型必须是void Foo(int, void*),其第一个参数为当前滑块位置,第二个参数为userdata。该参数可以为NULL,表示没有回调函数被调用。这里的回调函数为onTrackbarSlide
      userdata用户传给回调函数的值,默认为0。

        做完上面这些工作,终于可以开始读取视频了!大致的操作跟第一个例子差不多,只不过需要同步进度和已播放的帧数。

    cur_pos = (int)g_cap.get(cv::CAP_PROP_POS_FRAMES);
    

        这里又一次调用get(int proId)来获取当前帧的索引值,并用该值设置滑块的位置:

    cv::setTrackbarPos("Position", "video", cur_pos);
    

      参数分别为进度条ID、窗口ID和当前位置的值。
      通过waitKey()返回值判断当前是否需要暂停、播放和退出。

      效果大概酱:
    在这里插入图片描述

    展开全文
  • OpenCV更改视频

    2020-11-02 21:02:21
    opencv2/opencv.hpp> #include<iostream> using namespace cv; using namespace std; int main() { VideoCapture cap("out.avi");//25视频 Mat frame; int w = int(cap.get(CAP_PROP_FRAME_WIDTH)); ...
    #include<opencv2/opencv.hpp>
    #include<iostream>
    using namespace cv;
    using namespace std;
    int main() {
    
        VideoCapture cap("out.avi");//25帧视频
        Mat frame;
        int w = int(cap.get(CAP_PROP_FRAME_WIDTH));
        int h = int(cap.get(CAP_PROP_FRAME_HEIGHT));
        VideoWriter out("out_50.avi", CV_FOURCC('M', 'J', 'P', 'G'), 50, Size(w, h));    //    更改为50帧
        int framenumber = cap.get(CV_CAP_PROP_FRAME_COUNT);//读取视频帧
        for (size_t i = 0; i < framenumber; i++) {
            cap >> frame;
            out.write(frame);
            cout << "out frame:" << i+1 << endl;
        }
    }

     

    展开全文
  • opencv调整视频大小

    千次阅读 2013-12-28 09:35:43
    //获取一图片 if(frame == NULL) break; CvSize dstSize = cvSize(frame->width * 2, frame->height * 2); IplImage *dst = cvCreateImage(dstSize, frame->depth, frame->nChannels); cvResize...
  • OpenCV对输入视频的每一帧调整大小并生成新的视频代码编程环境源代码代码使用说明实验结果 代码编程环境 Windows系统; OpenCV3.4.1; Visual studio 2017 源代码 #include <stdio.h> #include <tchar.h>...
  • Android通过OpenCV获取摄像头数据并在悬浮框显示
  • opencv将frame保存为视频

    千次阅读 2018-12-24 22:47:49
    opnecv2/opencv.hpp" #include &lt;iostream&gt; using namespace std; using namespace cv; int main() { int c=0; VideoCapture cap(c);//调用摄像头,如果有多个摄像头,可以调整c(0,1,2,...)...
  • import cv2 as cv import numpy cap = cv.VideoCapture('./shangyiv.mp4') fourcc = cv.VideoWriter_fourcc(*'mp4v') width = int(cap.get(3)) ...#fps=60,这里是视频的帧率,可以随意调整,大小只影响每张图片的播
  • opencv 实线PS色阶调整

    2021-09-06 16:26:49
    opencv2/opencv.hpp> #include <iostream> using namespace cv; class Level { public: int Shadow; //输入色阶黑点值 float Midtones; //输入色阶灰点值(注意是浮点数) int Highlight; //输入...
  • 调整帧数 cv2.imwrite( ' image/output/vieo1_ ' + str(frameNum) + " .jpg " , frame) # 保存图片 cv2.namedWindow( " resized " , 0) # 0可以改变窗口大小了 # cv2.resizeWindow("resized", 640, ...
  • 差法:连续三,12相减,23相减,结果做与运算。 相减公式: 其中阈值T需要手动调整。 结果得到一个二值图,对二值图做腐蚀,膨胀,在发现轮廓,其中所涉及到得函数有: cv2.absdiff(img1,img2)#两图相减 ...
  • MFC+OPENCV显示视频每一

    千次阅读 2019-02-28 17:17:52
    opencv2\opencv.hpp" #include"opencv2\highgui\highgui.hpp" HWND hPlayWnd0 = NULL; //句柄 hPlayWnd0 = GetDlgItem(IDC_CAM)-&gt;m_hWnd; //初始化的时候进行 void DrawMat(Mat cvImg,...
  • 使用python3.6,opencv3.3.1在64位win10下运行,使用capture.get(cv2.CAP_PROP_POS_FRAMES)得到当前数,使用capture.set(cv2.CAP_PROP_POS_FRAMES, position)得到后面一,这里的细节是:必须重新read一遍视频...
  • opencv读取avi视频并抽取

    千次阅读 2017-12-18 10:42:43
    opencv读取avi视频并抽取
  • 其中原视频格式应该转换成 .mov(小编只在这种情况获得成功,其他可以自行测试),如果需要调整分辨率的话,必须有: frame=cv2.resize(frame,(350,256)) 这一过程,否则视频将无法写入,视频输出大小为0...
  • 表现为:OPENCV打开摄像头成功,但获取摄像头视频得到的数据为空,使用AMCAP2.exe进行测试摄像头,使用MJPG格式可以正常浏览,但把视频设置为YUV的格式后也无法预览。 于是想到把OPENCV设置为MJPG方式打开摄像头...
  • OpenCV

    2019-11-06 22:36:35
    OpenCV教程 OpenCV教程这里提到的所有源代码都是作为OpenCV常规版本的一部分提供的,因此请在开始复制和粘贴代码之前检查。以下教程列表将自动从位于我们的GIT存储库中的reST文件生成。 和往常一样,我们很乐意听到...
  • // //来自于仕琪的讲稿 《使用OpenCV进行图像处理》]中的例程 /************************************************** * 背景建模,运动物体检测 * ******************************************...
  • 文章目录【OpenCV+pyqt5】视频抽相关操作pyqt5搭建界面界面功能简介功能测试OpenCV功能详解读取视频并显示视频信息时间转换函数根据获得的视频进行抽视频裁剪图片转视频暂存问题 【OpenCV+pyqt5】视频抽相关...
  • 近段时间需要采集图片进行网络训练,所以就开车出去采集了几段视频,然后运用opencv截取视频中的任意,并保存为图片。因为整段视频会有一些问题,所以不想随机截取,我使用人工按键来进行判断是否需要采集,这样就...
  • 目录说在前面Code 说在前面 opencv版本:4.0.1 ...【opencv/videoio module】(一)Video Input with OpenCV and similarity measurement 【opencv/videoio module】(二)Creating a video with Ope...
  • C++利用差法背景差分实现运动目标检测(opencv

    万次阅读 多人点赞 2017-08-07 15:37:38
    差法、光流法、背景减除法 运动目标检测是指在序列图像中检测出变化区域并将运动目标从背景图像中提取出来。通常情况下,目标分类、跟踪和行为理解等后处理过程仅仅考虑图像中对应于运动目标的像素区域,因此运动...
  • OpenCv入门

    2021-08-06 13:10:08
    Opencv快速入门一、Opencv简介1.1 图像处理简介1.2 OpenCv的模块二、OpenCv基本操作2.1 图像的基本操作 一、Opencv简介 OpenCv简介:OpenCV是应用广泛的开源图像处理库,我们以其为基础,介绍相关的图像处理方法:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,477
精华内容 2,190
关键字:

opencv调整帧