opencv提取试卷中的试题

opencv提取试卷中的试题

首页技巧更新时间:2025-04-08 01:56:22

本文仅对 Opencv图像读取与保存进行阐述,重在探讨图像读取与保存过程中应注意的细节问题。

1 图像读取

首先看一下,imread函数的声明:

// C : Mat based Mat imread(const string& filename, int flags=1 ); // C: IplImage based IplImage* cvLoadImage(const char* filename, int iscolor=CV_LOAD_IMAGE_COLOR ); // C: CvMat based CvMat* cvLoadImageM(const char* filename, int iscolor=CV_LOAD_IMAGE_COLOR );

此处,就不列出python的函数声明。随着2.x和3.x版本号不断更新, OpenCV的C 版本号数据结构和C版本号有较大差异,前者降低了指针的大量使用。使用方法更加便捷,因此建议多使用前者。以C 版本号函数进行分析,形參列表包含:

假设你喜欢使用imread("file.jpg")缺省參数的形式载入图像。务必要留意你所载入后的图像可能已经不是你原本想要的图像了。

从 Opencv源代码枚举类型中也能够看到上述标识符含义:

// highgui.hpp enum { // 8bit, color or not IMREAD_UNCHANGED =-1, // 8bit, gray IMREAD_GRAYSCALE =0, // ?, color IMREAD_COLOR =1, // any depth, ? IMREAD_ANYDEPTH =2, // ?, any color IMREAD_ANYCOLOR =4 }; // highui_c.h enum { /* 8bit, color or not */ CV_LOAD_IMAGE_UNCHANGED =-1, /* 8bit, gray */ CV_LOAD_IMAGE_GRAYSCALE =0, /* ? , color */ CV_LOAD_IMAGE_COLOR =1, /* any depth, ? */ CV_LOAD_IMAGE_ANYDEPTH =2, /* ?, any color */ CV_LOAD_IMAGE_ANYCOLOR =4 };

Opencv已经支持眼下非常多图像格式,可是并不是所有。

主要包含:

对于常见的支持4通道的图像格式来说, Opencv读取结果是有差异的:

// 1.tif, 1.jp2 and 1.png are color images with 4 channels: R, G, B, A cv::Mat imageTif = cv::imread("E:\\1.tif"); // the default flags is 1 cv::Mat imageJp2 = cv::imread("E:\\1.jp2"); // the default flags is 1 cv::Mat imagePng = cv::imread("E:\\1.png"); // the default flags is 1 std::cout << imageTif.channels() << std::endl; // prints 3 std::cout << imageJp2.channels() << std::endl; // prints 3 std::cout << imagePng.channels() << std::endl; // prints 3 cv::Mat imageTif2 = cv::imread("E:\\1.tif", -1); // flags = -1 cv::Mat imageJp22 = cv::imread("E:\\1.jp2", -1); cv::Mat imagePng2 = cv::imread("E:\\1.png", -1); std::cout << imageTif2.channels() << std::endl; // prints 3 std::cout << imageJp22.channels() << std::endl; // prints 3 std::cout << imagePng2.channels() << std::endl; // prints 4

由此可见,眼下 Opencv能够直接读取4通道图像并保留Alpha通道的貌似仅仅有PNG格式,对于非PNG格式数据,须要保留Alpha通道的应用,假设坚持使用 Opencv库,建议转格式吧~

2 图像存储

首先来看,imwrite函数的声明:

// c : Mat based bool imwrite(const string& filename, InputArray img, const vector<int>& params=vector<int>() ); // C: CvMat and IplImage based int cvSaveImage(const char* filename, const CvArr* image, const int* params=0 );

仍旧以C 版本号为例。其形參列表为:

vector<int> compression_params; compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION); // paramId_1, png compression compression_params.push_back(9); // paramValue_2, compression level is 9

在 Opencv中。主要对JPEG,PNG和PXM的编码方式进行了特别声明:

// highgui.hpp enum { imwrite_JPEG_QUALITY =1, // quality from 0 to 100, default value is 95. (The higher is the better) IMWRITE_PNG_COMPRESSION =16, // compression level from 0 to 9, default value is 3. (A higher value means a smaller size and longer compression time. Default value is 3.) IMWRITE_PNG_STRATEGY =17, IMWRITE_PNG_BILEVEL =18, IMWRITE_PNG_STRATEGY_DEFAULT =0, IMWRITE_PNG_STRATEGY_FILTERED =1, IMWRITE_PNG_STRATEGY_HUFFMAN_ONLY =2, IMWRITE_PNG_STRATEGY_RLE =3, IMWRITE_PNG_STRATEGY_FIXED =4, IMWRITE_PXM_BINARY =32 // binary format flag: 0 or 1, default value is 1. }; // highui_c.h enum { CV_IMWRITE_JPEG_QUALITY =1, CV_IMWRITE_PNG_COMPRESSION =16, CV_IMWRITE_PNG_STRATEGY =17, CV_IMWRITE_PNG_BILEVEL =18, CV_IMWRITE_PNG_STRATEGY_DEFAULT =0, CV_IMWRITE_PNG_STRATEGY_FILTERED =1, CV_IMWRITE_PNG_STRATEGY_HUFFMAN_ONLY =2, CV_IMWRITE_PNG_STRATEGY_RLE =3, CV_IMWRITE_PNG_STRATEGY_FIXED =4, CV_IMWRITE_PXM_BINARY =32 };

上述的标识符含义,显而易见,就不累述。

值得强调的是,imwrite函数支持存储的图像类型是有限的仅仅包含:1。3,4通道的图像,可是对于不同的图像格式。也是有差异的:

对于多通道图像,假设想对其每一个通道单独进行保存,当然也是可行的。一方面自己能够依据图像的信息和图层信息写出相应的存储函数,还有一方面 Opencv也提供了专门的函数split能够将图像的每一个通道提取出保存到vector中:


PNG原图

cv::Mat img = imread( "C:\\Users\\Leo\\Desktop\\Panda.png", CV_LOAD_IMAGE_UNCHANGED ); std::vector<cv::Mat> imageChannels; cv::split( img, imageChannels ); cv::imwrite("E:\\0.jpg", imageChannels[0]); cv::imwrite("E:\\1.jpg", imageChannels[1]); cv::imwrite("E:\\2.jpg", imageChannels[2]); cv::imwrite("E:\\3.jpg", imageChannels[3]);


B

G

R

A


通道分离保存结果

附上 Opencv文档源代码:

#include <vector> #include <stdio.h> #include <opencv2/opencv.hpp> using namespace cv; using namespace std; void createAlphaMat(Mat &mat) { CV_Assert(mat.channels() == 4); for (int i = 0; i < mat.rows; i) { for (int j = 0; j < mat.cols; j) { Vec4b& bgra = mat.at<Vec4b>(i, j); bgra[0] = UCHAR_MAX; // Blue bgra[1] = saturate_cast<uchar>((float (mat.cols - j)) / ((float)mat.cols) * UCHAR_MAX); // Green 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(int argv, char **argc) { // Create mat with alpha channel Mat mat(480, 640, CV_8UC4); createAlphaMat(mat); vector<int> compression_params; compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION); compression_params.push_back(9); try { imwrite("alpha.png", mat, compression_params); } catch (runtime_error& ex) { fprintf(stderr, "Exception converting image to PNG format: %s\n", ex.what()); return 1; } fprintf(stdout, "Saved PNG file with alpha data.\n"); return 0; }

执行结果为:

好文要顶 关注我 收藏该文 微信分享

,
大家还看了
也许喜欢
更多栏目

© 1998-2024 shitiku.com.cn,All Rights Reserved.