OpenCV 4.0.0学习笔记 (一) 图像与视频的读写

2023-11-07

目录

读取图片

imread方法

图片读取出错处理

读取的图片属性

写入图片

imwrite方法

带透明度的png图像

读取视频

capture结构体

下一帧与释放

读取视频属性 get()方法

写入视频

VideoWriter类

显示窗口Windows

窗口函数

一个窗口显示多张图片

Python numpy组合

matplotlib划分窗口显示多张图:

热门文章

最新评论

您愿意向朋友推荐“博客详情页”吗?

最新文章

目录

分类专栏


读取图片

文档地址

imread方法

Mat imread(const String & filename ,int flags=IMREAD_COLOR);
  • 1

imread读取图像,返回Mat对象,两个参数,第一个是文件名,支持位图bmp、dib,JPEG图像,PNG,webp,pbm,pgm,ppm,TIFF等多种图像,读取失败则返回空矩阵

第二个读取方式,默认值是1 flag = 1 返回三通道彩色图 flag = 0 灰度图 flag = -1 原图带alpha通道

如果返回三通道,编码顺序是BGR。支持读取的图像格式如下

Currently, the following file formats are supported:

  • Windows bitmaps - *.bmp, *.dib (always supported)
  • JPEG files - *.jpeg, *.jpg, *.jpe (see the Note section)
  • JPEG 2000 files - *.jp2 (see the Note section)
  • Portable Network Graphics - *.png (see the Note section)
  • WebP - *.webp (see the Note section)
  • Portable image format - *.pbm, *.pgm, *.ppm *.pxm, *.pnm (always supported)
  • Sun rasters - *.sr, *.ras (always supported)
  • TIFF files - *.tiff, *.tif (see the Note section)
  • OpenEXR Image files - *.exr (see the Note section)
  • Radiance HDR - *.hdr, *.pic (always supported)
  • Raster and Vector geospatial data supported by GDAL (see the Note section)
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main(int argc, char **argv) {
    // 图片路径 可以是/或者//或者\\或者 /、//、\\混合;但不能是单独的反斜杠 \
	Mat src = imread("C:/Users/muyi/Pictures/pic/5503.jpg");
	imshow("input", src);
	waitKey(0);
	destroyAllWindows();
	return 0;
}
import cv2
img = cv2.imread(filename,flags)  # 返回array矩阵,读取失败则是nonetype

图片读取出错处理

文件损坏、不存在、权限错误等问题导致读取图片失败,程序不会报错,但是返回的是空矩阵,不处理后续使用可能会出错。

Mat src = imread("test.png");
if (src.empty()) {
		printf("could not load image...\n");
		return -1;
	}
src = cv2.imread("test.png")
# 断言判断读取是否成功
assert type(src)==None,"load image error"
# 或者if语句判断
if src.all() == None:  #
    print("load image error")

# 或者 try,自定义异常
def read_img(path):
    img = cv2.imread(path)
    if img == None:   
        raise Exception("load image error")
    return img
try :
    read_img('eee.png')
except Exception as err:
    print(err)
else:
    后续处理

读取的图片属性

C++版本,读取图像以Mat对象形式存储,Python版本以np.array形式存储

Mat img = imread("C:\Users\muyi\Pictures\pic\5503.jpg");
// Mat类的部分属性
cout << "dims:" << img.dims << endl; // 矩阵的维度
cout << "rows:" << img.rows << endl; // 矩阵的行数
cout << "cols:" << img.cols << endl; // 矩阵列数
cout << "channels:" << img.channels() << endl; // 图像通道数
cout << "type:" << img.type() << endl; // 表示了矩阵中元素的类型以及矩阵的通道个数
cout << "depth:" << img.depth() << endl; // 深度
cout << "elemSize:" << img.elemSize() << endl; // 矩阵一个元素占用的字节数
cout << "elemSize1:" << img.elemSize1() << endl; //矩阵元素一个通道占用的字节数= elemSize / channels
// type为 CV_16SC3,那么elemSize = 3 * 16 / 8 = 6 bytes

图像矩阵的type取值:参考博客
它是一系列的预定义的常量,其命名规则为CV_(位数)+(数据类型)+(通道数)U(unsigned integer)表示的是无符号整数,S(signed integer)是有符号整数,F(float)是浮点数。 C1,C2,C3,C4则表示通道是1,2,3,4

type一般是在创建Mat对象时设定,如果要取得Mat的元素类型,则无需使用type,使用depth

depth 矩阵中元素的一个通道的数据类型,这个值和type是相关的。例如 type为 CV_16SC2,一个2通道的16位的有符号整数。那么,depth则是CV_16S。depth也是一系列的预定义值,
将type的预定义值去掉通道信息就是depth值: CV_8U CV_8S CV_16U CV_16S CV_32S CV_32F CV_64F

表1. Mat对象type的取值表

CV_8UC1 CV_8UC2 CV_8UC3 CV_8UC4
CV_8SC1 CV_8SC2 CV_8SC3 CV_8SC4
CV_16UC1 CV_16UC2 CV_16UC3 CV_16UC4
CV_16SC1 CV_16SC2 CV_16SC3 CV_16SC4
CV_32SC1 CV_32SC2 CV_32SC3 CV_32SC4
CV_32FC1 CV_32FC2 CV_32FC3 CV_32FC4
CV_64FC1 CV_64FC2 CV_64FC3 CV_64FC4
Mat img(3, 4, CV_16UC4, Scalar_<uchar>(1, 2, 3, 4));//3X4的矩阵 16位无符号4通道
//Scalar_是一个模板向量,用来初始化矩阵的每个像素,因为矩阵具有4个通道,Scalar_有四个值。

python版本cv图像格式,type(img) = numpy.ndarray 因此,它具有array的一切属性和方法,而不同于c++版本中Mat的deepth()、type()等写法。

img = cv2.imread("test.png")
print(img.shape) # [M,N,K] 行 列 通道数
print(img.size) # M*N*K
# 一些特殊方法
print(img.mean()) #平均值 img.sum() 元素和 std()标准差 等等
img = img.flatten()
img = img.ravel()
img = img.reshape()

写入图片

[文档地址][OpenCV: Image file reading and writing]

imwrite方法

bool cv::imwrite(const String & filename, InputArray img , const std::vector<int>&params = std::vector<int>)

retval = cv2.imwrite(filename, img[, params])

支持写入的图像格式与imread一致。8位单通道或3通道BGR编码数据才可以使用该函数。

16位无符号图像数据,可以保存为PNG, JPEG2000 和TIFF

32位浮点图像数据,可以保存为TIFF,OpenEXR,Radiance HDR格式

3通道32位浮点图像数据被保存TIFF格式,则存储为高动态范围图像(High-Dynamic Range,HDR),每个像素4字节

8位带透明度的PNG图像保存时需要创建第四个通道,最终数据格式是BGRA

对于非上述类型数据,可以通过mat.convertTo函数进行转换,然后写入图像文件

In general, only 8-bit single-channel or 3-channel (with ‘BGR’ channel order) images can be saved using this function

  • 16-bit unsigned (CV_16U) images can be saved in the case of PNG, JPEG 2000, and TIFF formats
  • 32-bit float (CV_32F) images can be saved in TIFF, OpenEXR, and Radiance HDR formats; 3-channel (CV_32FC3) TIFF images will be saved using the LogLuv high dynamic range encoding (4 bytes per pixel)
  • PNG images with an alpha channel can be saved using this function. To do this, create 8-bit (or 16-bit) 4-channel image BGRA, where the alpha channel goes last. Fully transparent pixels should have alpha set to 0, fully opaque pixels should have alpha set to 255/65535 (see the code sample below).

带透明度的png图像

c++源码,创建带透明度的PNG图像。(出自cv文档imwrite函数说明)

#include <opencv2/imgcodecs.hpp>
using namespace cv;
using namespace std;
static void createAlphaMat(Mat &mat)
{
    CV_Assert(mat.channels() == 4); // 等同于c++里面的assert,条件为false返回错误信息
    for (int i = 0; i < mat.rows; ++i)
    {
        for (int j = 0; j < mat.cols; ++j)
        {  // 行列遍历进行赋值  Vec是OpenCV定义的向量模板类
            Vec4b& bgra = mat.at<Vec4b>(i, j);
            bgra[0] = UCHAR_MAX; // Blue define UCHAR_MAX 0xff 
            bgra[1] = saturate_cast<uchar>((float (mat.cols - j)) / ((float)mat.cols) * UCHAR_MAX); // Green  saturate_cast<unchar>是一个防止颜色操作溢出的函数,数据小于0置0;大于255置255
            bgra[2] = saturate_cast<uchar>((float (mat.rows - i)) / ((float)mat.rows) * UCHAR_MAX); // Red
            bgra[3] = saturate_cast<uchar>(0.5 * (bgra[1] + bgra[2])); // Alpha
        }
    }
}
int main()
{
    // Create mat with alpha channel
    Mat mat(480, 640, CV_8UC4);
    createAlphaMat(mat); // 创建矩阵数据
    vector<int> compression_params;
    compression_params.push_back(IMWRITE_PNG_COMPRESSION); // 枚举值16
    compression_params.push_back(9);
    bool result = false;
    try
    {
        result = imwrite("alpha.png", mat, compression_params);
    }
    catch (const cv::Exception& ex)
    {
        fprintf(stderr, "Exception converting image to PNG format: %s\n", ex.what());
    }
    if (result)
        printf("Saved PNG file with alpha data.\n");
    else
        printf("ERROR: Can't save PNG file.\n");
    return result ? 0 : 1;
}

python实现

import cv2
import numpy as np
img = np.zeros((480,640,4),np.float)
def saturate(num):  ## 不清楚cv2防止颜色溢出函数,因此自定义了一个类似的函数
    if num >255.0:
        return 255.0
    if num <0.0:
        return 0.0
    else:
        return num
rows = img.shape[0]
cols = img.shape[1]
for i in range(rows):
    for j in range(cols):
        temp = img[i][j] # 像素[i][j]位置的四个通道数据
        temp[0] = 0xff
        temp[1] = saturate((cols-j)/rows*255.0)
        temp[2] = saturate((rows-j) /cols *255.0)
        temp[3] = saturate(temp[2]+temp[1])  #可以看到不同透明度,显示效果不一样
cv2.imwrite('alpha.png',img)

效果如图
在这里插入图片描述

读取视频

videoCapture结构体,可以读取文件视频、网页视频流和摄像头的数据。

[文档地址][OpenCV: cv::VideoCapture Class Reference]

capture结构体

函数原型 VideoCapture (const String &filename, int apiPreference=CAP_ANY)

cv2.VideoCapture(filename[, apiPreference])

Opens a video file or a capturing device or an IP video stream for video capturing with API Preference

第一个参数是数据流或视频路径,第二个是API设置,读取的摄像头编号,默认CAP_ANY=0,自动检测摄像头。多个摄像头时,使用索引0,1,2,…进行编号调用摄像头。 apiPreference = -1时单独出现窗口,选取相应编号摄像头

通常使用 ==bool isOpened()==判断是否打开视频或摄像头成功。

下一帧与释放

cap >> frame或者 ==cap.read(frame)==读取下一帧,函数定义是CV_WRAP virtual bool read(OutputArray image);读取帧失败会返回布尔值false,因此可以进行判断

视频帧读取的 read 、grab 、retrieve三种方式:

retrieve速度比grab慢很多,有时可以通过grab跳过不需要的帧,而不需要用read解码每一帧。

  1. cap.read(frame) 结合grab和retrieve的功能,抓取下一帧并解码
  2. cap.grap() 从设备或视频获取下一帧,获取成功返回true否则false
  3. cap.retrieve(frame) 在grab后使用,对获取到的帧进行解码,也返回true或false
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int, char**)
{
	Mat frame; //定义帧
	VideoCapture cap;
	int deviceID = 0;             // 0 = open default camera
	int apiID = cv::CAP_ANY;      // 0 = autodetect default API
    
	cap.open(deviceID + apiID);  //打开摄像头
	// check if we succeeded
	if (!cap.isOpened()) {
		cerr << "ERROR! Unable to open camera\n";
		return -1;
	}
	//--- GRAB AND WRITE LOOP
	cout << "Start grabbing" << endl
		<< "Press any key to terminate" << endl;
	for (;;)
	{
		// wait for a new frame from camera and store it into 'frame'
		cap.read(frame);  //读取下一帧,并可以返回读取成功与否
        //等价于 cap >> frame 同时等价于 cap.grab();cap.retrieve(frame);
		if (frame.empty()) {
			cerr << "ERROR! blank frame grabbed\n";
			break;
		}
		imshow("Live", frame);
		if (waitKey(100) >= 0)
			break;
	}
	// the camera will be deinitialized automatically in VideoCapture destructor
	return 0;
}

import cv2
cap = cv2.VideoCapture(0)
if cap.isOpened():
    while True:
        ret, prev = cap.read()  # ret是读取状态,prev下一帧
        """
        等价于
       if cap.grab():
        	ret, prev = cap.retrieve()
        """
        if ret==True:
            cv2.imshow('video', prev)
        else:
            break
        if cv2.waitKey(20)==27:
            break
cv2.destroyAllWindows()

release()在使用完后进行手动释放capture对象

读取视频属性 get()方法

函数原型:double cv::VideoCapture::get(int propId)

retval=cv2.VideoCapture.get(propId)

cv2.VideoCapture.get(0)     视频文件的当前位置(播放)以毫秒为单位
cv2.VideoCapture.get(1)     基于以0开始的被捕获或解码的帧索引
cv2.VideoCapture.get(2)     视频文件的相对位置(播放):0=电影开始,1=影片的结尾。
cv2.VideoCapture.get(3)     在视频流的帧的宽度
cv2.VideoCapture.get(4)     在视频流的帧的高度
cv2.VideoCapture.get(5)     帧速率
cv2.VideoCapture.get(6)     编解码的4字-字符代码
cv2.VideoCapture.get(7)     视频文件中的帧数
cv2.VideoCapture.get(8)     返回对象的格式
cv2.VideoCapture.get(9)     返回后端特定的值,该值指示当前捕获模式
cv2.VideoCapture.get(10)     图像的亮度(仅适用于照相机)
cv2.VideoCapture.get(11)     图像的对比度(仅适用于照相机)
cv2.VideoCapture.get(12)     图像的饱和度(仅适用于照相机)
cv2.VideoCapture.get(13)     色调图像(仅适用于照相机)
cv2.VideoCapture.get(14)     图像增益(仅适用于照相机)(Gain在摄影中表示白平衡提升)
cv2.VideoCapture.get(15)     曝光(仅适用于照相机)
cv2.VideoCapture.get(16)     指示是否应将图像转换为RGB布尔标志
cv2.VideoCapture.get(17)     × 暂时不支持
cv2.VideoCapture.get(18)     立体摄像机的矫正标注(目前只有DC1394 v.2.x后端支持这个功能)

写入视频

函数文档OpenCV: cv::VideoWriter Class Reference

VideoWriter类

cv::VideoWriter::VideoWriter(const String & filename,int fourcc,double fps,Size frameSize,bool 	isColor = true )  // isColor

cv2.VideoWriter(filename, fourcc, fps, frameSize[, isColor])
cv.VideoWriter(filename, apiPreference, fourcc, fps, frameSize[, isColor])

写入视频需要指定视频的帧率fps , 帧尺寸framesize ,编码格式fourcc

framesize的大小应该与写入的每一帧图像尺寸大小一致

输出文件类型要与编码类型一致

几种常用视频编解码器

生成文件占用空间最小的编码方式是MPEG-4.2 。在VideoWriter类的构造函数参数为CV_FOURCC(‘M’, ‘P’, ‘4’, ‘2’) 。

最大的是MPEG-1,对应在VideoWriter类的构造函数参数为CV_FOURCC(‘P’,‘I’,‘M’,‘1’) ,所占磁盘空间是前者的5.7倍。

fourcc定义

static int cv::VideoWriter::fourcc(char c1,char c2,char c3,char c4 )
retval  =  cv2.VideoWriter_fourcc(  c1, c2, c3, c4  )
cv2.VideoWriter_fourcc('m','p','a','v') AVI或者mp4文件 
cv2.VideoWriter_fourcc('M','J','P','G') avi或者mp4 motion-jpeg编码
cv2.VideoWriter_fourcc('P','I','M','I') MPEG-1编码 AVI文件
cv2.VideoWriter_fourcc('X','V','I','D') MPEG-4编码 AVI文件
cv2.VideoWriter_fourcc('T','H','E','O')  Ogg Vorbis 后缀名 ogv
cv2.VideoWriter_fourcc('F','L','V','1')  flash视频,后缀名 flv

c++创建writer对象和写入图像帧有两种方式

#include <opencv2/opencv.hpp>
#include<opencv2/video.hpp>
using namespace cv;
using namespace std;
int main() {
    //方法1  定义对象,然后使用open方法开启  opencv2/videoio.hpp定义了fourcc
	VideoWriter out;
	int fourcc = out.fourcc('M', 'J','P', 'G');
	out.open("video.mp4", fourcc, 30.0, cv::Size(640, 480), // 单帧图片分辨率为 640x480
	true // 只输入彩色图
	);

/* 方法2  构造函数*/  
   VideoWriter out(
       const string& filename, // 输入文件名
		int fourcc, // 编码形式,
		double fps, // 输出视频帧率
		cv::Size frame_size, // 单帧图片的大小
		bool is_color = true // 如果是false,可传入灰度图像 
	);
}

python将文件夹中所有图片写入视频

import cv2
import os

im_dir = 'det'  #图片路径
video_dir = 'out4.avi' #输出视频路径
fps = 23.977 #输出视频路径
#图片数 
num = 888
img_size = (500,300)
#fourcc = cv2.cv.CV_FOURCC('M','J','P','G')#opencv2.4
fourcc = cv2.VideoWriter_fourcc('M','J','P','G') #opencv3.0之后的写法
videoWriter = cv2.VideoWriter(video_dir, fourcc, fps, img_size) #定义视频写入类

pics = os.listdir(im_dir)

for i in range(num):
    im_name = os.path.join(im_dir, str(i)+'.jpg')
    frame = cv2.imread(im_name)
    if type(frame) != None:
        videoWriter.write(frame) #写入帧

videoWriter.release()
print ('finish')

显示窗口Windows

可以自定义窗口显示图像的模式

窗口函数

[官方文档][OpenCV: High-level GUI]

函数原型 void nameWindow(const string& winname,int flags = WINDOW_AUTOSIZE) ;第一个参数是窗口名字,第二个是显示模式,flag 默认值 是window_autosize

  1. WINDOW_AUTOSIZE 窗口大小自动适应图片大小,并且不可手动更改
  2. WINDOW_NORMAL 用户可以改变这个窗口大小
  3. WINDOW_OPENGL 窗口创建的时候会支持OpenGL ,且可以更改窗口大小

定义窗口名称,imshow时可以指定让图像在该窗口显示

namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src);

cv2.namedWindow("input", cv2.WINDOW_AUTOSIZE)
cv2.imshow("input", src)

一个窗口显示多张图片

另一种方法是matplotlib

OpenCV一个窗口只能显示一张图片。但可以通过组合多张图,实现多张图在一个窗口的视觉效果。

Python numpy组合

用np.hstack或者np.vstack组合矩阵 若是要让各个图片之间显示间隔,可以插入0或255的列做间隔

#图1
img = cv2.imread(r'C:\Users\muyi\Pictures\pic\489321.jpg')
#图2
img2 = cv2.imread(r'C:\Users\muyi\Pictures\pic\489323.jpg')
#图集
imgs = np.hstack([img,img2])
#展示多个
cv2.imshow("mutil_pic", imgs)
#等待关闭
cv2.waitKey(0)

在这里插入图片描述

OpenCV一个窗口显示多个图片的注意事项:

读入的多个图片必须具有相同的尺寸、通道数。若是彩图、灰度图同时显示,会出现窗口黑屏现象

matplotlib划分窗口显示多张图:

利用 plt.subplot(m,n,k)划分窗口即可,类似matlab的绘图,而且各个窗口可以显示不同格式的图像

参考网址:

https://blog.csdn.net/qq_39987952/article/details/90734205

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV 4.0.0学习笔记 (一) 图像与视频的读写 的相关文章

  • 安装 gstreamer 对 opencv python 包的支持

    我已经从源代码构建了自己的 opencv python 包 import cv2 print cv2 version 打印 3 4 5 现在我面临的问题是关于 opencv 的 VideoCapture 类中的 gstreamer 的使用
  • 使用 Xcode 为 OS X Lion / Mountain Lion 编译 OpenCV (2.3.1+)

    谁能给我提供一些如何使用 Xcode 在 OS X Lion 上编译 OpenCV 2 3 1 的详细指南 我对此很生气 我得到了源代码 使用 cmake 创建 Xcode 模板并尝试构建它 但它失败并出现大约 200 个错误 提前致谢 多
  • 从 PyCharm IDE 运行 Django 项目时出现“ImportError:没有名为 cv2 的模块”

    我正在从 PyCharm 运行一个 Django 项目 其配置设置为使用 virtualenv 中的 Python 解释器 该解释器依赖于 opencv 当我运行时 该网站在本地运行良好django admin py runserver 但
  • OpenCV:处理每一帧

    我想使用 OpenCV 编写一个跨平台应用程序进行视频捕获 在所有示例中 我发现来自相机的帧是使用抓取功能进行处理并等待一段时间 我想处理序列中的每一帧 我想定义自己的回调函数 每次当一个新帧准备好处理时都会执行该函数 例如直播对于 Win
  • 将 RGB 转换为黑色或白色

    我如何在Python中获取RGB图像并将其转换为黑白图像 不是灰度 我希望每个像素要么是全黑 0 0 0 要么是全白 255 255 255 流行的 Python 图像处理库中是否有任何内置功能可以完成此任务 如果不是 最好的方法是循环遍历
  • ECC 导致多光谱图像的图像对齐失败

    我正在尝试将 RGB 图像与 IR 图像 单通道 对齐 目标是创建 4 通道图像 R G B IR 为了做到这一点 我正在使用cv2 findTransformECC如中所述这个非常简洁的指南 https learnopencv com i
  • 如何在 CMake Makefile 中包含 OpenCV 库

    我希望你可以帮助我 我有一个简单的 CMakeLists txt 以便在 Leopard 10 5 8 上构建我的项目 我正在使用 CMake 2 8 1 目前这是代码 cmake minimum required VERSION 2 8
  • OpenCV Python 删除图像中的某些对象

    我正在使用带有 opencv 和 numpy 的 python 来检测天文中的星星 例如这个1 https i stack imgur com AKwEJ jpg图片 使用模板匹配 我可以用阈值检测星星 单击 2 2 https i sta
  • 附加信息:OpenCV:使用 c# 的不同大小的对象

    目前 我的 EmguCV c 代码面临问题 我试图从数据库中识别我的图像 但它不起作用 一旦检测到我的脸 它就会崩溃 然后会出现此错误 附加信息 OpenCV 不同大小的对象 我尝试寻找这个错误 但我一无所知 这是我的代码 Action f
  • 从单应性估计 R/T

    我一直在尝试计算 2 个图像中的特征 然后将这些特征传递回CameraParams R没有运气 特征已成功计算并匹配 但是问题是将它们传递回R t 我明白你必须分解Homography为了使这一点成为可能 我已经使用如下方法完成了 http
  • 如何计算立体视觉的基本矩阵

    我正在尝试编写一些代码来计算基本矩阵以确定立体图像之间的关系 我从大多数人推荐的 Hartley 和 Zisserman 书开始 但它没有任何实际示例 并且示例代码是在 MATLAB 中 而我没有 然后我切换到这个比较实用 里面有实际例子
  • 如何使用 SimpleBlobDetector 获取 blob 的额外信息?

    robot sherrick 回答了我这个问题 https stackoverflow com a 13534094 1705967 这是他回答的后续问题 cv SimpleBlobDetectorOpencv 2 4 中的 看起来非常令人
  • 如何获得垂直线穿过的完整内轴线?

    我有一个图像 我想获取穿过其中轴的像素 我尝试使用骨架化 and 中轴方法来获取它们 但这两种方法都返回比相应对象短的一维线 这是带有示例图像的代码 gt gt gt import skimage filter gt gt gt impor
  • 如何将 opencv mat 图像转换为 gdi 位图

    我想将 openCV Mat 文件转换为 GDI 位图图像 我找不到任何有关如何执行此操作的信息 我认为没有直接的方法可以做到这一点 但我希望它不涉及将其写入文件并读回 http opencv users 1802565 n2 nabble
  • VideoCapture 未检测到 uEye 摄像头

    我的 uEye 相机遇到了一个问题 使用我的笔记本电脑摄像头 id 0 或 USB 上的网络摄像头 id 1 此行完美运行 TheVideoCapturer open 1 TheVideoCapturer 属于 VideoCapture 类
  • 如何将k4a_image_t转换为opencv矩阵? (Azure Kinect 传感器 SDK)

    我开始尝试使用 Azure Kinect Sensor SDK 我经历了官方操作指南 https learn microsoft com en us azure Kinect dk about sensor sdk sensor sdk 我
  • OpenCV 读取视频文件时内存不足

    此示例从文件中读取视频cv2 VideoCapture在 python OpenCV 中内存不足 import cv2 cap cv2 VideoCapture file mp4 while True ret frame cap read
  • 将yuv420p原始数据转换为opencv图像

    我有来自 rtmp 服务器的原始数据 像素格式为 yuv420p 我使用管道来读取数据 但我不知道如何将原始数据解码为图像 command ffmpeg command extend loglevel fatal i rtmp localh
  • 在OpenCV中将YUV转换为BGR或RGB

    我有一个电视采集卡 其输入内容为 YUV 格式 我在这里看到了与此问题类似的其他帖子 并尝试尝试所述的所有可能的方法 但它们都没有提供清晰的图像 目前最好的结果是 OpenCVcvCvtColor scr dst CV YUV2BGR 函数
  • 在 Python 中使用音频流 RTMP 通过管道和 OpenCV 到 FFmpeg

    我正在尝试使用音频流式传输 FFmpeg 我将在下面展示我的代码 导入模块 import subprocess as sp 创建变量 rtmpUrl rtmp a rtmp youtube com live2 key camera path

随机推荐

  • 计算机网络:TCP 流量控制

    目录 操作系统缓冲区与滑动窗口的关系 窗口关闭 糊涂窗口综合症 参考资料 发送方在发数据给接收方时 要考虑接收方处理能力 如果一直无脑的发数据给对方 但对方处理不过来 那么就会导致触发重发机制 从而导致网络流量的无端的浪费 为了解决这种现象
  • Kafka集群搭建配置与eagle监控界面

    kafka集群环境搭建 首先在多台机器上搭建配置Kafka环境 可以参考Kafak环境搭建 Kafka kafka环境配置以及参数分析 集群搭建配置 对于kafka来说 一个单独的broker意味着kafka集群中只有一个节点 要想增加ka
  • IPFS环境搭建和用ipfs-api访问ipfs网络

    ipfs是去中心化星际文件系统 本文介绍节点软件ipfs环境搭建和使用方法 学习ipfs api在nodejs代码中访问ipfs网络 一 ipfs节点安装与使用 1 1下载节点软件 到官网下载windows版的ipfs节点软件 32位 64
  • Python 过滤次新股、停牌、涨跌停

    过滤次新股 是否涨跌停 是否停牌等条件 def filcon context bar dict tar list def zdt trade stock context bar dict yesterday history 2 1d clo
  • 【表的完整性约束&外键约束】

    外键约束 今天跟大家聊聊这个外键约束 简单来说呢 就是 嗯 关于两个表的操作 对 就是这样的 来跟我一起看看叭 1 什么是外键约束 外键约束 FOREIGN KEY 缩写FK 是用来实现数据库表的参照完整性的 外键约束可以使两张表紧密的结合
  • 绕坐标轴以及任意轴的旋转矩阵的推导

    概述 本文主要是针对 3D数学基础 图形与游戏开发 这本书的读书笔记 这本书前面部分还是讲得挺好的 有时间还是建议读一下 旋转矩阵的推导 旋转矩阵怎么来的我倒一直都没有概念 这本书里面对旋转矩阵的来历倒是给了我一些启发 首先从二维的旋转矩阵
  • 清华教授熬夜写出来的一套Python学习路线图,真的是yyds!

    首先 我是从零开始学Python的 以前也去过 现在看来我当初走了很多弯路 就把我的经验分享给大家吧 首先也是最重要的 你为什么要学Python 你是想做一个网站 写一个得心应手的工具 还是仅仅通过学校的考试 这极大地影响了你如何学习Pyt
  • xml中xsd/xsi/xsl/xmlns的区别和联系

    2023 01 13Fri才明白 具体解析xml文件的不是xml文件本身 xsi也不是在解析xml文件 只是检验xml文件是否符合标准 xsd是在限制xml文件的内容 而具体解析某个element究竟是什么样式 起到什么作用 是需要接收端自
  • 黑马程序员之---C学习笔记之printf与scanf使用及注意事项

    Java培训 Android培训 iOS培训 Net培训 一 printf函数介绍 printf函数是一个标准库函数 能够以精确的格式输出程序运算的结果 1 格式字符串 是由格式字符 包括 转换说明符 标志 域宽 精度 和普通字符组成 转换
  • Object setPrototypeOf()方法

    Set the prototype of an object 设置对象的原型 While you re here see my guide on JavaScript Prototypal Inheritance 当您在这里时 请参阅我的J
  • asp.net web开发框架_你还在为框架发愁?手把手带你搭建性能优越基于.NET Core框架...

    Hello 大家好 今天分享下ABP框架的搭建 旨在搭建一个成熟的API 基于前后端分离模式 可以让小伙伴只管业务 而不拘泥于框架架构的约束 玩技术的我们都知道 一个性能优越 成熟的框架是非常重要的 他可以为我们省下充足的时间 用于业务开发
  • STM32(HAL库)驱动OLED

    简介 通过STM32F103C8T6单片机采用HAL库方式对0 96寸OLED IIC通讯 屏幕进行驱动 之前GY906驱动通过软件IIC进行驱动 因此本次通过硬件IIC进行驱动 2 1 Cubemax初始化配置 首先进行初始化配置 点击进
  • 嵌入式MCU开发开源项目

    1 FreeModbus Slave Master RTT STM32 简介 FreeModbus是一款开源的Modbus协议栈 但是只有从机开源 主机源码是需要收费的 同时网上也没有发现比较好的开源的Modbus主机协议栈 所以才开发这款
  • 【备忘】es统计各个平台的每日活跃数量

    query bool must range unixtime gt 1631548800000 lt 1631635200000
  • 第十七课,帧缓存(后期处理)

    反向 void main FragColor vec4 vec3 1 0 texture screenTexture TexCoords 1 0 灰度 均分灰度 void main FragColor texture screenTextu
  • git diff,git format-patch,git apply和patch小问题三则

    这个文档主要是用来记录工作中遇到的git patch 相关的命令的介绍和相关常见问题的解决方案 Patch文件有3中 git 给我们提供了2种patch 方案 一是用git diff生成的标准patch 二是git format patch
  • Spring Boot使用slf4j+Logback进行日志记录

    Spring Boot使用slf4j Logback进行日志记录 个人总结使用logback步骤 1 yml或 properties配置日志文件的所在路径和输出日志的范围 级别 2 配置好logback xml文件的各项参数 包括日志输出格
  • 利用vscode--sftp,将本地项目/文件上传到远程服务器中详细教程

    1 首先在 vscode 中下载 sftp 2 然后在 vscode 中打开本地将要上传的项目或文件 3 安装完后 使用快捷键 ctrl shift P 打开指令窗口 输入 sftp config 回车 在当前目录中会自动生成 vscode
  • 最小生成树笔记(Prim算法&&Kruskal算法)

    1 最小生成树 最小生成树 Minimum Spanning Tree 简称MST 是指 在一个连通无向图中 找到一个包含所有顶点的树 且该树的所有边的权重之和最小 换句话说 最小生成树是原图中的一个子图 它包含所有顶点 并且连接所有顶点的
  • OpenCV 4.0.0学习笔记 (一) 图像与视频的读写

    目录 读取图片 imread方法 图片读取出错处理 读取的图片属性 写入图片 imwrite方法 带透明度的png图像 读取视频 capture结构体 下一帧与释放 读取视频属性 get 方法 写入视频 VideoWriter类 显示窗口W