opencv常用函数集合


1.颜色空间转换cvtColor()

C++: void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 );
参数解释: 
. InputArray src: 输入图像即要进行颜色空间变换的原图像,可以是Mat类 
. OutputArray dst: 输出图像即进行颜色空间变换后存储图像,也可以Mat类 
. int code: 转换的代码或标识,即在此确定将什么制式的图片转换成什么制式的图片,后面会详细将 
. int dstCn = 0: 目标图像通道数,如果取值为0,则由src和code决定




2.图像读取

opencv使用imread读取图片,imshow显示图片,但是对于我而言,常使用jupyter作为展示的工具,imshow在浏览器环境中就失去了它的作用,因此我会使用matplotlib来展示

#读取一张图片
cv2.imread(img,flag)
#img这一参数中填入图片的完全路径或者相对路径

这里我们需要稍微了解下flag这个参数,这决定了opencv是如何读入我们的图像的
我们知道通常图像每个像素点的颜色我们以RGB的格式来描述(或者RGBA),可以通过三基色(red,green,blue)来描述所有颜色,对于透明图片我们会增加一个a(alpha)来描述其颜色的透明度.

    cv2.IMREAD_COLOR : 读入图片,任何与透明度相关通道的会被忽视,默认以这种方式读入.
    cv2.IMREAD_GRAYSCALE : 以灰度图的形式读入图片.
    cv2.IMREAD_UNCHANGED : 保留读取图片原有的颜色通道.

可以简单的用-1,0,1来分别表示这3个flag

opencv默认的imread是以BGR的方式进行存储的,而matplotlib的imshow默认则是以RGB格式展示









<think>根据用户的问题,用户希望了解在C++中使用OpenCV库时,与“find”相关的函数的使用方法。在OpenCV中,并没有一个直接叫做“find”的函数,但有很多以“find”开头的函数,例如`findContours`(查找轮廓)、`findHomography`(查找单应性矩阵)等。此外,还有一些函数用于在图像中查找特定特征,如模板匹配(可以视为一种查找)等。 考虑到用户的问题比较宽泛,我将介绍几个常用的与“查找”相关的函数: 1. **`findContours`**:用于在二值图像中查找轮廓。 2. **`findHomography`**:用于查找两个平面之间的单应性矩阵。 3. **模板匹配**:虽然不是以“find”命名,但用于在图像中查找模板的位置。 另外,用户提供的引用中提到了`findContours`函数(引用[2])和`imread`函数(引用[4])等,因此我将重点介绍`findContours`,并简要提及其他相关函数。 ### 1. findContours函数 `findContours`函数用于在二值图像中检测轮廓。轮廓可以用于形状分析、物体检测等。 #### 函数原型 ```cpp void findContours(InputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset = Point()); ``` #### 参数说明 - **image**:输入图像,必须是8位单通道二值图像(非黑即白)。通常需要先对图像进行二值化处理。 - **contours**:检测到的轮廓。每个轮廓存储为点向量(`std::vector<std::vector<cv::Point>>`)。 - **hierarchy**:可选输出向量,包含图像的拓扑信息(如轮廓之间的层次关系)。 - **mode**:轮廓检索模式,常用: - `cv::RETR_EXTERNAL`:只检索最外层轮廓。 - `cv::RETR_LIST`:检索所有轮廓,但不建立层次关系。 - `cv::RETR_TREE`:检索所有轮廓,并重建完整的层次结构。 - **method**:轮廓近似方法,常用: - `cv::CHAIN_APPROX_NONE`:存储所有轮廓点。 - `cv::CHAIN_APPROX_SIMPLE`:压缩水平、垂直和对角线段,仅保留端点。 - **offset**:可选偏移量,用于移动轮廓点。 #### 使用步骤 1. 读取图像并转换为灰度图。 2. 对灰度图进行二值化处理(如使用`threshold`函数)。 3. 调用`findContours`函数。 4. 可选:使用`drawContours`函数绘制轮廓。 #### 示例代码 参考用户提供的引用[2],并稍作完善: ```cpp #include <opencv2/opencv.hpp> #include <iostream> int main() { // 读取图像(引用[4]中提到的imread函数) cv::Mat image = cv::imread("your_image.jpg", cv::IMREAD_GRAYSCALE); if (image.empty()) { std::cout << "Could not open or find the image!" << std::endl; return -1; } // 二值化处理(确保图像是二值的) cv::Mat binary; cv::threshold(image, binary, 128, 255, cv::THRESH_BINARY); // 查找轮廓 std::vector<std::vector<cv::Point>> contours; std::vector<cv::Vec4i> hierarchy; cv::findContours(binary, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); // 创建彩色图像用于绘制轮廓 cv::Mat colorImage; cv::cvtColor(image, colorImage, cv::COLOR_GRAY2BGR); // 将灰度图转为彩色图以便绘制彩色轮廓 // 绘制轮廓(可选,使用drawContours函数) cv::drawContours(colorImage, contours, -1, cv::Scalar(0, 0, 255), 2); // 绘制所有轮廓,红色,线宽2 // 显示结果 cv::imshow("Contours", colorImage); cv::waitKey(0); return 0; } ``` ### 2. findHomography函数 `findHomography`用于计算两个平面之间的单应性矩阵(3x3矩阵),常用于图像拼接、相机位姿估计等。 #### 函数原型 ```cpp Mat findHomography(InputArray srcPoints, InputArray dstPoints, int method=0, double ransacReprojThreshold=3, OutputArray mask=noArray(), const int maxIters=2000, const double confidence=0.995); ``` #### 参数说明 - **srcPoints**:源平面上的点集(一般为待匹配图像的匹配点)。 - **dstPoints**:目标平面上的点集(一般为参考图像的匹配点)。 - **method**:计算方法,常用`cv::RANSAC`(鲁棒方法,可排除异常点)。 - **ransacReprojThreshold**:RANSAC算法中使用的重投影误差阈值。 - **mask**:输出掩码,标记哪些点是内点(由RANSAC使用)。 - **maxIters**:RANSAC最大迭代次数。 - **confidence**:置信度。 #### 使用步骤 1. 在两幅图像中检测特征点(如SIFT、ORB等)。 2. 匹配特征点(使用BFMatcher或FlannBasedMatcher)。 3. 提取匹配点对的坐标。 4. 调用`findHomography`计算单应性矩阵。 5. 使用`warpPerspective`进行图像变换。 ### 3. 模板匹配 模板匹配用于在大图像中查找模板图像的位置。使用函数`matchTemplate`,然后通过`minMaxLoc`来定位匹配结果。 #### 示例代码 ```cpp #include <opencv2/opencv.hpp> int main() { cv::Mat img = cv::imread("big_image.jpg"); cv::Mat templ = cv::imread("template.jpg"); // 创建结果矩阵 cv::Mat result; int result_cols = img.cols - templ.cols + 1; int result_rows = img.rows - templ.rows + 1; result.create(result_rows, result_cols, CV_32FC1); // 模板匹配 cv::matchTemplate(img, templ, result, cv::TM_CCOEFF_NORMED); // 归一化(可选) // cv::normalize(result, result, 0, 1, cv::NORM_MINMAX, -1, cv::Mat()); // 定位最佳匹配位置 double minVal, maxVal; cv::Point minLoc, maxLoc; cv::minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc); // 绘制矩形框出模板位置(使用maxLoc,因为TM_CCOEFF_NORMED方法中最大值表示最佳匹配) cv::rectangle(img, maxLoc, cv::Point(maxLoc.x + templ.cols, maxLoc.y + templ.rows), cv::Scalar(0,0,255), 2); cv::imshow("Result", img); cv::waitKey(0); return 0; } ``` ### 总结 在OpenCV中,与“查找”相关的函数有很多,具体使用哪个取决于应用场景: - 查找轮廓:`findContours` - 查找单应性矩阵:`findHomography` - 在图像中查找模板:`matchTemplate`配合`minMaxLoc` 用户可以根据具体需求选择相应的函数。 §§相关问题§§ 1. 如何优化`findContours`的性能? 2. `findHomography`函数中RANSAC参数如何选择? 3. 模板匹配有哪些匹配方法(`cv::TM_CCOEFF_NORMED`等)?它们有什么区别?</think>在C++中使用OpenCV进行图像查找和处理时,`findContours`是查找轮廓的核心函数,而`imread`、`threshold`等是预处理关键函数。以下是详细使用方法: ### 一、findContours函数使用详解 用于在二值图像中查找轮廓(物体边界)[^2] ```cpp #include <opencv2/opencv.hpp> int main() { // 1. 读取图像(引用[4]) cv::Mat image = cv::imread("object.jpg", cv::IMREAD_GRAYSCALE); // 2. 二值化处理(创建黑白图像) cv::Mat binary; cv::threshold(image, binary, 128, 255, cv::THRESH_BINARY); // 3. 查找轮廓(核心步骤) std::vector<std::vector<cv::Point>> contours; // 存储轮廓点集 std::vector<cv::Vec4i> hierarchy; // 轮廓层级关系 cv::findContours( binary, // 输入二值图像 contours, // 输出轮廓集合 hierarchy, // 输出层级 cv::RETR_EXTERNAL, // 检索最外层轮廓 cv::CHAIN_APPROX_SIMPLE // 压缩冗余点 ); // 4. 绘制轮廓(可视化) cv::Mat result = cv::Mat::zeros(image.size(), CV_8UC3); cv::drawContours(result, contours, -1, cv::Scalar(0,255,0), 2); // 5. 显示结果 cv::imshow("Contours", result); cv::waitKey(0); return 0; } ``` ### 二、关键参数说明 1. **检索模式**(第4参数): - `RETR_EXTERNAL`:只检测最外层轮廓 - `RETR_TREE`:检测所有轮廓并重建完整嵌套关系 - `RETR_LIST`:检测所有轮廓不建立层级 2. **近似方法**(第5参数): - `CHAIN_APPROX_NONE`:存储所有轮廓点 - `CHAIN_APPROX_SIMPLE`:压缩水平/垂直/对角线线段(节省内存) ### 三、预处理关键函数 1. **图像读取**(引用[4]): ```cpp // 读取彩色图(默认) cv::Mat colorImg = cv::imread("input.jpg"); // 读取灰度图(轮廓检测常用) cv::Mat grayImg = cv::imread("input.jpg", cv::IMREAD_GRAYSCALE); ``` 2. **二值化处理**: ```cpp cv::threshold(src, dst, 128, // 阈值 255, // 最大值 cv::THRESH_BINARY | cv::THRESH_OTSU // 自动阈值 ); ``` ### 四、典型应用场景 1. **物体识别**:通过轮廓特征(面积/周长/凸包)识别特定物体 ```cpp for (auto& contour : contours) { double area = cv::contourArea(contour); if (area > 1000) { // 过滤小面积噪声 cv::Rect bbox = cv::boundingRect(contour); cv::rectangle(result, bbox, cv::Scalar(255,0,0), 2); } } ``` 2. **形状分析**:通过多边形逼近识别几何形状 ```cpp std::vector<cv::Point> approx; cv::approxPolyDP(contour, approx, 0.01*arcLength, true); if (approx.size() == 4) { // 四边形处理 } ``` ### 五、注意事项 1. **必须输入二值图像**:使用前需通过`threshold`、`Canny`等转为黑白图 2. **内存管理**:大图像可能产生大量轮廓点,建议用`CHAIN_APPROX_SIMPLE`压缩 3. **性能优化**:640×480图像处理约需3ms(i7 CPU) > 完整流程:读图→灰度化→二值化→查找轮廓→分析轮廓→输出结果[^3][^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值