【转】OpenCV对图片中的RotatedRect进行填充

函数名:full_rotated_rect

函数参数: image输入图像,rect希望在图像中填充的RotatedRect,color填充的颜色

主要的思路是:先找到RotatedRect的四个顶点,然后画出外框。再利用四个顶点找出其中平行两边的所有点,对相应的两个点进行连接。

 1 void full_rotated_rect(Mat &image, const RotatedRect &rect, const Scalar &color)
 2 {
 3     CvPoint2D32f point[4];
 4     Point pt[4];
 5     vector<Point> center1, center2;
 6
 7     /*画出外框*/
 8     cvBoxPoints(rect, point);
 9     for (int i = 0; i<4; i++)
10     {
11         pt[i].x = (int)point[i].x;
12         pt[i].y = (int)point[i].y;
13     }
14     line(image, pt[0], pt[1], color, 1);
15     line(image, pt[1], pt[2], color, 1);
16     line(image, pt[2], pt[3], color, 1);
17     line(image, pt[3], pt[0], color, 1);
18
19     /*填充内部*/
20     find_all_point(pt[0], pt[1], center1);  /*找出两点间直线上的所有点*/
21     find_all_point(pt[3], pt[2], center2);
22     vector<Point>::iterator itor1 = center1.begin(), itor2 = center2.begin();
23     while (itor1 != center1.end() && itor2 != center2.end())
24     {
25         line(image, *itor1, *itor2, color, 1);  /*连接对应点*/
26         itor1++;
27         itor2++;
28     }
29
30     vector<Point>().swap(center1);
31     vector<Point>().swap(center2);
32 }  

函数名:find_all_point

函数参数:start起始点,end结束点,save保存点的容器

主要思路:递归查找两点的中点,直到两点相同。

 1 void find_all_point(Point start, Point end, vector<Point> &save)
 2 {
 3     if (abs(start.x - end.x) <= 1 && abs(start.y - end.y) <= 1)
 4     {
 5         save.push_back(start);
 6         return; /*点重复时返回*/
 7     }
 8
 9     Point point_center;
10     point_center.x = (start.x + end.x) / 2;
11     point_center.y = (start.y + end.y) / 2;
12     save.push_back(point_center);   /*储存中点*/
13     find_all_point(start, point_center, save);  /*递归*/
14     find_all_point(point_center, end, save);
15 }  

原图:

填充后:

转自WizardtoH

时间: 2024-10-12 22:48:05

【转】OpenCV对图片中的RotatedRect进行填充的相关文章

Opencv 截取图片中一部分的方法(包括任意区域)

对于图像的截取的方式很多都是对 IplImage* img 这种格式的进行操作的. 1.对cvMat操作其实非常的简单: Mat image= imreadimag): Rect rect(10, 20, 100, 50); Mat image_roi = image(rect); 另外:srcImage(rect).copyTo(roiImage)也可以达到同样的效果! 2.IplImage* img 从图里面截取矩形的操作一般是这个样子的: CvSize size= cvSize(40,50

opencv python:ROI 与 泛洪填充

提取ROI区域,处理然后放回去: 泛洪填充 测试代码:显示一张图像,鼠标点击之后,会从该点开始进行填充,显示填充后的结果图像 注:二值图像的填充需要使用选项:cv2.FLOODFILL_MASK_ONLY 选项说明: cv2.FLOODFILL_FIXED_RANGE:改变图像,泛洪填充 cv2.FLOODFILL_MASK_ONLY:不改变图像,只填充遮罩层本身,忽略新的颜色值参数 import cv2 import numpy as np # 读取一张图片 src = cv2.imread(

opencv 检测图片中圆形物体(解决乱线问题)

2018-03-0418:03:12 整体代码如下: def detect_circle_demo (image): # 降噪处理 dst = cv.pyrMeanShiftFiltering(image,10,80) cv.imshow("jiangzao",dst) cimage = cv.cvtColor(dst,cv.COLOR_BGR2GRAY) # 灰度图转换 print("正在灰度转换......") cv.imshow("test"

opencv:图形绘制与填充

#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main(int argc, char** argv) { Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3); // 相关绘制的API /* line 参数说明: 1. 在哪个图像上绘制 2. 起点 3. 终点 4. 颜色 5. 线宽 6. typ

【OpenCV】图像旋转详解,边缘用黑色填充

项目要用到图像旋转,OpenCV里面居然没有专门封装好的函数,只好自己写了.根据<learnning OpenCV>发现效果不是很理想,旋转后图像大小不变,可是图像却被裁减了. 例子如下: int main( int argc, char** argv ) { IplImage* src=cvLoadImage("C:\\Users\\Liu\\Desktop\\bridge.bmp",1); IplImage* dst = cvCloneImage( src ); int

OpenCV玩九宫格数独(一)——九宫格图片中提取数字

前言 首先要明确我们的任务.要想解数独,需要进行计算,图片格式的数字肯定是不行的,所以必须把图片上的数字转换为实实在在的数字才能进行计算.要得到实实在在的数字,我们需要做的是对图片上的数字进行提取和识别.本文先说第一步,图片中数字的提取. 在一年之前,我曾用C++尝试过opencv解数独,但由于当时水平有限,未能完成.当时的成果就是透视变换的应用和方格数字的提取.现在稍微简化一下工作,不再从倾斜的数独图片中提取数独,而是直接用正拍且已经提取好的数独开始处理.这里用到的数独图片如下图所示: 方法

Opencv图像识别从零到精通(24)------漫水填充,种子填充,区域生长、孔洞填充

可以说从这篇文章开始,就结束了图像识别的入门基础,来到了第二阶段的学习.在平时处理二值图像的时候,除了要进行形态学的一些操作,还有有上一节讲到的轮廓连通区域的面积周长标记等,还有一个最常见的就是孔洞的填充,opencv这里成为漫水填充,其实也可以叫种子填充,或者区域生长,基本的原理是一样的,但是应用的时候需要注意一下,种子填充用递归的办法,回溯算法,漫水填充使用堆栈,提高效率,同时还提供了一种方式是扫描行.经常用来填充孔洞,现在来具体看看. 漫水填充:也就是用一定颜色填充联通区域,通过设置可连通

OpenCV与EmguCV中的漫水填充

漫水填充算法,是根据选定的种子点,用一种自定义的颜色填充种子点的联通区域,通过设置可连通像素的上下限以及连通方式来达到不同的填充效果. 漫水填充经常被用来标记或分离图像的一部分以便对其进行进一步处理或分析. 所谓漫水填充,简单来说,就是自动选中了和种子点相连的区域,接着将该区域替换成指定的颜色. 漫水填充也可以用来从输入图像获取掩码区域,掩码会加速处理过程,或者只处理掩码指定的像素点. 在OpenCV中,漫水填充是填充算法中最通用的方法.且在OpenCV 2.X中,使用C++重写过的FloodF

opencv FloodFill(漫水填充)和物体选取

简介 本篇主要是介绍opencv的FloodFill(漫水填充)和基于它实现的物体选取. FloodFill使用 FloodFill函数 C++: int floodFill(InputOutputArray image, InputOutputArray mask, Point seedPoint, Scalar newVal, Rect* rect=0, Scalar loDiff=Scalar(), Scalar upDiff=Scalar(), int flags=4 ); InputO