opencv 将视频读为图片放在指定文件夹中/将指定文件夹中图片读出并合成视频 cvCreateVideoWriter试分析

#include <fstream>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <opencv/cv.h>
#include <opencv/highgui.h> 
 

//
// 该程序实现视频和图片的相互转换.
// Image_to_video()函数将一组图片合成AVI视频文件.
// Video_to_image()函数将AVI视频文件读入,将每一帧存储为jpg文件.
//



#define NUM_FRAME 300 //只处理前300帧,根据视频帧数可修改


void Video_to_image(char* filename)
{
printf("------------- video to image ... ----------------\n");

//初始化一个视频文件捕捉器
CvCapture* capture = cvCaptureFromAVI(filename);

//获取视频信息
cvQueryFrame(capture);
int frameH    = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);
int frameW    = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);
int fps       = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
int numFrames = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);
printf("\tvideo height : %d\n\tvideo width : %d\n\tfps : %d\n\tframe numbers : %d\n", frameH, frameW, fps, numFrames);

//定义和初始化变量
int i = 0;
IplImage* img = 0;
char * image_name=NULL;
//char image_name[20];
image_name=(char *)malloc(20*sizeof(char)); //动态分配内存

cvNamedWindow( "mainWin", CV_WINDOW_AUTOSIZE );

//读取和显示
while(1)
{
  
   img = cvQueryFrame(capture); //获取一帧图片
   cvShowImage( "mainWin", img ); //将其显示
   char key = cvWaitKey(20);
  
   sprintf(image_name, "%s%d%s", "d:\\images\\image", ++i, ".jpg");//保存的图片名
    //如何将这些图片保存到一个指定的文件夹中? //"d:\\images\\image" 将图片存放在d盘images文件夹下                
    cvSaveImage(image_name, img);   //保存一帧图片
   if(i == NUM_FRAME) break;
}

cvReleaseCapture(&capture);
cvDestroyWindow("mainWin");
}

 

void Image_to_video()
{
int i = 0;
IplImage* img = 0;
char * image_name=NULL;
//char image_name[20];
image_name=(char *)malloc(20*sizeof(char)); //动态分配内存

printf("------------- image to video ... ----------------\n");

//初始化视频编写器,参数根据实际视频文件修改
CvVideoWriter *writer = 0;
int isColor = 1;
int fps     = 25; // or 30
int frameW = 400; // 744 for firewire cameras
int frameH = 240; // 480 for firewire cameras
writer=cvCreateVideoWriter("out10.avi",CV_FOURCC('X','V','I','D'),fps,cvSize(frameW,frameH),isColor);

printf("\tvideo height : %d\n\tvideo width : %d\n\tfps : %d\n", frameH, frameW, fps);

//创建窗口
cvNamedWindow( "mainWin", CV_WINDOW_AUTOSIZE );

while(i<NUM_FRAME)
{
   sprintf(image_name, "%s%d%s", "d:\\images\\image", ++i, ".jpg");//读取d盘images文件夹下图片
   img = cvLoadImage(image_name);
   if(!img)
   {
    printf("Could not load image file...\n");
    exit(0);
   }
   cvShowImage("mainWin", img);
   cvWriteFrame(writer, img);
   //char key = cvWaitKey(20);
   cvReleaseImage(&img);
   if( cvWaitKey(20) >= 0 ) break;

}

cvReleaseVideoWriter(&writer);
cvDestroyWindow("mainWin");
}


int main(int argc, char *argv[])
{

   char filename[13] = "test.avi";

   Video_to_image(filename); //视频转图片

   Image_to_video();    //图片转视频

return 0;
}
//--------------------------------------------------------------------------------

<strong></strong>

关于cvCreateVideoWriter

创建视频文件写入器

typedef struct CvVideoWriter CvVideoWriter;
CvVideoWriter* cvCreateVideoWriter( const char* filename, int fourcc, double fps, CvSize frame_size, int is_color=1 );
filename 
输出视频文件名。
fourcc 
四个字符用来表示压缩帧的codec 例如,CV_FOURCC('P','I','M','1')是MPEG-1 codec, CV_FOURCC('M','J','P','G')是motion-jpeg codec等。 在Win32下,如果传入参数-1,可以从一个对话框中选择压缩方法和压缩参数。
fps 
被创建视频流的帧率。
frame_size 
视频流的大小。
is_color 
如果非零,编码器将希望得到彩色帧并进行编码;否则,是灰度帧(只有在Windows下支持这个标志)。

函数cvCreateVideoWriter创建视频写入器结构。

 对于CV_FOURCC逐个调试,运行结果:

<p>//             各种格式 ——输出视频名称  视频大小 对应编码器的代号</p><p>//CV_FOURCC('F','L','V','1')——out1.avi 5.60M  FLV1 codec 
//CV_FOURCC('P','I','M','1')——out2.avi 5.63M  MPEG-1 codec  
//CV_FOURCC('M','P','4','2')——out3.avi 4.95M  MPEG-4.2 codec 
//CV_FOURCC('M','J','P','G')——out4.avi 12.2M  motion-jpeg codec
//CV_FOURCC('D','I','V','3')——out5.avi 4.90M  MPEG-4.3 codec 
//CV_FOURCC('D','I','V','X')——out6.avi 5.08M  MPEG-4 codec 
//CV_FOURCC('U','2','6','3')——out7.avi 0M     H263 codec 
//CV_FOURCC('I','2','6','3')——out8.avi 0M     H263I codec 
//CV_FOURCC('X','V','I','D')——out9.avi 5.08M


//OpenCV中通过CV_FOURCC生成指定编码器的代号
//若将CV_FOURCC(……)改成 -1 将会打开一个编码器的选择窗口.
</p>


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以按照以下步骤实现: 1. 导入 OpenCV 库和 os 库。 ```python import cv2 import os ``` 2. 定义一个函数,用于将图像按颜色分类。 ```python def classify_by_color(image_path, output_path): # 读取图像 image = cv2.imread(image_path) # 将图像从 BGR 颜色空间转换到 HSV 颜色空间 hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 定义颜色范围 lower_red = (0, 50, 50) upper_red = (10, 255, 255) lower_green = (50, 50, 50) upper_green = (70, 255, 255) lower_blue = (110, 50, 50) upper_blue = (130, 255, 255) # 根据颜色范围创建掩膜 red_mask = cv2.inRange(hsv_image, lower_red, upper_red) green_mask = cv2.inRange(hsv_image, lower_green, upper_green) blue_mask = cv2.inRange(hsv_image, lower_blue, upper_blue) # 将掩膜应用到原图像上 red_image = cv2.bitwise_and(image, image, mask=red_mask) green_image = cv2.bitwise_and(image, image, mask=green_mask) blue_image = cv2.bitwise_and(image, image, mask=blue_mask) # 将分类后的图像保存到指定目录下 cv2.imwrite(os.path.join(output_path, "red_" + os.path.basename(image_path)), red_image) cv2.imwrite(os.path.join(output_path, "green_" + os.path.basename(image_path)), green_image) cv2.imwrite(os.path.join(output_path, "blue_" + os.path.basename(image_path)), blue_image) ``` 3. 遍历指定目录下的所有图像文件,调用上述函数进行分类。 ```python input_path = "input_images" output_path = "output_images" # 创建输出目录 os.makedirs(output_path, exist_ok=True) # 遍历输入目录下的所有图像文件 for filename in os.listdir(input_path): if filename.endswith(".jpg") or filename.endswith(".jpeg") or filename.endswith(".png"): # 对每个图像进行颜色分类 classify_by_color(os.path.join(input_path, filename), output_path) ``` 这样,就可以将指定目录下的所有图像按颜色分类到指定文件夹了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值