精华内容
下载资源
问答
  • 为获取较为准确的质心,拟用最大内接矩形的中心作为该区域质心。 采用改进的中心扩散法求内接矩形:先以最小外接矩的中心作为算法的起点进行中心扩散。得到一个解矩形,在对最小外接矩的中心进行8邻域的遍历,应用...
  • opencv 最大内接矩形笔记

    千次阅读 2021-11-01 12:23:16
    0_x, data_0_y], [data_1_x, data_1_y], [data_2_x, data_2_y], [data_3_x, data_3_y]]) # 必须是array数组的形式 ret=cv2.boundingRect(cnt) x,y,w,h=ret 最大内接矩形,从轮廓中所有坐标中获取其中4个坐标即可: ...

    python 最小外接矩形,

    最小外接矩形的顶点坐标:cv2.boxPoints

            cnt = np.array([[data_0_x, data_0_y], [data_1_x, data_1_y], [data_2_x, data_2_y], [data_3_x, data_3_y]])  # 必须是array数组的形式
            rect = cv2.minAreaRect(cnt)  # 得到最小外接矩形的(中心(x,y), (宽,高), 旋转角度)
            box = cv2.boxPoints(rect)  # 获取最小外接矩形的4个顶点坐标
            box = np.int0(box)
            cv2.drawContours(img, [box], 0, (255, 0, 0), 1)

    轮廓矩形框:

    
    cnt = np.array([[data_0_x, data_0_y], [data_1_x, data_1_y], [data_2_x, data_2_y], [data_3_x, data_3_y]])  # 必须是array数组的形式
    ret=cv2.boundingRect(cnt)
    x,y,w,h=ret

    最大内接矩形,从轮廓中所有坐标中获取其中4个坐标即可:

    python 获取过程如下:

    转自:图像轮廓最大内接矩形的求法 - 奥布莱恩 - 博客园

    def order_points(pts):
        # pts为轮廓坐标
        # 列表中存储元素分别为左上角,右上角,右下角和左下角
        rect = np.zeros((4, 2), dtype = "float32")
        # 左上角的点具有最小的和,而右下角的点具有最大的和
        s = pts.sum(axis = 1)
        rect[0] = pts[np.argmin(s)]
        rect[2] = pts[np.argmax(s)]
        # 计算点之间的差值
        # 右上角的点具有最小的差值,
        # 左下角的点具有最大的差值
        diff = np.diff(pts, axis = 1)
        rect[1] = pts[np.argmin(diff)]
        rect[3] = pts[np.argmax(diff)]
        # 返回排序坐标(依次为左上右上右下左下)
        return rect
     
    
    img = cv2.imread(path)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    blurred = cv2.blur(gray, (9, 9))
    _, thresh = cv2.threshold(blurred, 155, 255, cv2.THRESH_BINARY)
    _, cnts, _ = cv2.findContours( thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
    c = sorted(cnts, key=cv2.contourArea, reverse=True)[0]<br>先找出轮廓点
    
    rect = order_points(c.reshape(c.shape[0], 2))
    print(rect)
    xs = [i[0] for i in rect]
    ys = [i[1] for i in rect]
    xs.sort()
    ys.sort()
    #内接矩形的坐标为
    print(xs[1],xs[2],ys[1],ys[2])

    一下内容转自:

    python-opencv 图像捕捉多个不规则轮廓,与轮廓内接区域(圆/矩形)思路-持续更新编辑中(会附上详细的思路解释和图片) - Lorzen - 博客园

    def drawInRectgle(img, cont, cX, cY, x_min, x_max, y_min, y_max):
                """绘制不规则最大内接正矩形"""
                # img 对应的是原图, 四个极值坐标对应的是最大外接矩形的四个顶点
                c = cont  # 单个轮廓
                # print(c)
                range_x, range_y = x_max - x_min, y_max - y_min   # 轮廓的X,Y的范围
                x1, x2, y1, y2 = cX, cX, cY, cY     # 中心扩散矩形的四个顶点x,y
                cnt_range, radio = 0, 0
                shape_flag = 1                      # 1:轮廓X轴方向比Y长;0:轮廓Y轴方向比X长
                if range_x > range_y:                     # 判断轮廓 X方向更长
                    radio, shape_flag = int(range_x / range_y), 1
                    range_x_left = cX - x_min
                    range_x_right = x_max - cX
                    if range_x_left >= range_x_right:   # 取轴更长范围作for循环
                        cnt_range = int(range_x_left)
                    if range_x_left < range_x_right:
                        cnt_range = int(range_x_right)
                else:                                   # 判断轮廓 Y方向更长
                    radio, shape_flag = int(range_y / range_x), 0
                    range_y_top = cY - y_min
                    range_y_bottom = y_max - cY
                    if range_y_top >= range_y_bottom:   # 取轴更长范围作for循环
                        cnt_range = int(range_y_top)
                    if range_y_top < range_y_bottom:
                        cnt_range = int(range_y_bottom)
                print("X radio Y: %d " % radio)
                print("---------new drawing range: %d-------------------------------------" % cnt_range)
                flag_x1, flag_x2, flag_y1, flag_y2 = False, False, False, False
                radio = 5       # 暂时设5,统一比例X:Y=5:1 因为发现某些会出现X:Y=4:1, 某些会出现X:Y=5:1
                if shape_flag == 1:
                    radio_x = radio - 1
                    radio_y = 1
                else:
                    radio_x = 1
                    radio_y = radio - 1
                for ix in range(1, cnt_range, 1):      # X方向延展,假设X:Y=3:1,那延展步进值X:Y=3:1
                    # 第二象限延展
                    if flag_y1 == False:
                        y1 -= 1 * radio_y       # 假设X:Y=1:1,轮廓XY方向长度接近,可理解为延展步进X:Y=1:1
                        p_x1y1 = cv.pointPolygonTest(c, (x1, y1), False)
                        p_x2y1 = cv.pointPolygonTest(c, (x2, y1), False)
                        if p_x1y1 <= 0 or y1 <= y_min or p_x2y1 <= 0:  # 在轮廓外,只进行y运算,说明y超出范围
                            for count in range(0, radio_y - 1, 1):    # 最长返回步进延展
                                y1 += 1     # y超出, 步进返回
                                p_x1y1 = cv.pointPolygonTest(c, (x1, y1), False)
                                if p_x1y1 <= 0 or y1 <= y_min or p_x2y1 <= 0:
                                    pass
                                else:
                                    break
                            # print("y1 = %d, P=%d" % (y1, p_x1y1))
                            flag_y1 = True
    
                    if flag_x1 == False:
                        x1 -= 1 * radio_x
                        p_x1y1 = cv.pointPolygonTest(c, (x1, y1), False)    # 满足第二象限的要求,像素都在轮廓内
                        p_x1y2 = cv.pointPolygonTest(c, (x1, y2), False)    # 满足第三象限的要求,像素都在轮廓内
                        if p_x1y1 <= 0 or x1 <= x_min or p_x1y2 <= 0:       # 若X超出轮廓范围
                            # x1 += 1  # x超出, 返回原点
                            for count in range(0, radio_x-1, 1):       #
                                x1 += 1         # x超出, 步进返回
                                p_x1y1 = cv.pointPolygonTest(c, (x1, y1), False)  # 满足第二象限的要求,像素都在轮廓内
                                p_x1y2 = cv.pointPolygonTest(c, (x1, y2), False)  # 满足第三象限的要求,像素都在轮廓内
                                if p_x1y1 <= 0 or x1 <= x_min or p_x1y2 <= 0:
                                    pass
                                else:
                                    break
                            # print("x1 = %d, P=%d" % (x1, p_x1y1))
                            flag_x1 = True              # X轴像左延展达到轮廓边界,标志=True
                    # 第三象限延展
                    if flag_y2 == False:
                        y2 += 1 * radio_y
                        p_x1y2 = cv.pointPolygonTest(c, (x1, y2), False)
                        p_x2y2 = cv.pointPolygonTest(c, (x2, y2), False)
                        if p_x1y2 <= 0 or y2 >= y_max or p_x2y2 <= 0:  # 在轮廓外,只进行y运算,说明y超出范围
                            for count in range(0, radio_y - 1, 1):  # 最长返回步进延展
                                y2 -= 1     # y超出, 返回原点
                                p_x1y2 = cv.pointPolygonTest(c, (x1, y2), False)
                                if p_x1y2 <= 0 or y2 >= y_max or p_x2y2 <= 0:  # 在轮廓外,只进行y运算,说明y超出范围
                                    pass
                                else:
                                    break
                            # print("y2 = %d, P=%d" % (y2, p_x1y2))
                            flag_y2 = True              # Y轴像左延展达到轮廓边界,标志=True
                    # 第一象限延展
                    if flag_x2 == False:
                        x2 += 1 * radio_x
                        p_x2y1 = cv.pointPolygonTest(c, (x2, y1), False)    # 满足第一象限的要求,像素都在轮廓内
                        p_x2y2 = cv.pointPolygonTest(c, (x2, y2), False)    # 满足第四象限的要求,像素都在轮廓内
                        if p_x2y1 <= 0 or x2 >= x_max or p_x2y2 <= 0:
                            for count in range(0, radio_x - 1, 1):  # 最长返回步进延展
                                x2 -= 1     # x超出, 返回原点
                                p_x2y1 = cv.pointPolygonTest(c, (x2, y1), False)  # 满足第一象限的要求,像素都在轮廓内
                                p_x2y2 = cv.pointPolygonTest(c, (x2, y2), False)  # 满足第四象限的要求,像素都在轮廓内
                                if p_x2y1 <= 0 or x2 >= x_max or p_x2y2 <= 0:
                                    pass
                                elif p_x2y2 > 0:
                                    break
                            # print("x2 = %d, P=%d" % (x2, p_x2y1))
                            flag_x2 = True
                    if flag_y1 and flag_x1 and flag_y2 and flag_x2:
                        print("(x1,y1)=(%d,%d)" % (x1, y1))
                        print("(x2,y2)=(%d,%d)" % (x2, y2))
                        break
                # cv.line(img, (x1,y1), (x2,y1), (255, 0, 0))
                cv.rectangle(img, (x1, y1), (x2, y2), (255, 255, 255), 1, 8)
    
                return x1, x2, y1, y2

    c++版

    OpenCVSharp 小练习 最大内接矩形_tfarcraw的博客-CSDN博客

    ​​​​​​opencv:求区域的内接矩形_cfqcfqcfqcfqcfq的博客-CSDN博客_opencv 内接矩形

    #include<opencv2\opencv.hpp>
    #include <iostream>
    #include<vector>
     
    using namespace cv;
    using namespace std;
     
    /**
    * @brief expandEdge 扩展边界函数
    * @param img:输入图像,单通道二值图,深度为8
    * @param edge  边界数组,存放4条边界值
    * @param edgeID 当前边界号
    * @return 布尔值 确定当前边界是否可以扩展
    */
     
    bool expandEdge(const Mat & img, int edge[], const int edgeID)
    {
    	//[1] --初始化参数
    	int nc = img.cols;
    	int nr = img.rows;
    	switch (edgeID) {
    	case 0:
    		if (edge[0]>nr)
    			return false;
    		for (int i = edge[3]; i <= edge[1]; ++i)
    		{
    			if (img.at<uchar>(edge[0], i) == 255)//遇见255像素表明碰到边缘线
    				return false;
    		}
    		edge[0]++;
    		return true;
    		break;
    	case 1:
    		if (edge[1]>nc)
    			return false;
    		for (int i = edge[2]; i <= edge[0]; ++i)
    		{
    			if (img.at<uchar>(i, edge[1]) == 255)//遇见255像素表明碰到边缘线
    				return false;
    		}
    		edge[1]++;
    		return true;
    		break;
    	case 2:
    		if (edge[2]<0)
    			return false;
    		for (int i = edge[3]; i <= edge[1]; ++i)
    		{
    			if (img.at<uchar>(edge[2], i) == 255)//遇见255像素表明碰到边缘线
    				return false;
    		}
    		edge[2]--;
    		return true;
    		break;
    	case 3:
    		if (edge[3]<0)
    			return false;
    		for (int i = edge[2]; i <= edge[0]; ++i)
    		{
    			if (img.at<uchar>(i, edge[3]) == 255)//遇见255像素表明碰到边缘线
    				return false;
    		}
    		edge[3]--;
    		return true;
    		break;
    	default:
    		return false;
    		break;
    	}
     
    }
     
    /**
    * @brief 求取连通区域内接矩
    * @param img:输入图像,单通道二值图,深度为8
    * @param center:最小外接矩的中心
    * @return  最大内接矩形
    * 基于中心扩展算法
    */
     
    cv::Rect InSquare(Mat &img, const Point center)
    {
    	// --[1]参数检测
    	if (img.empty() ||img.channels()>1|| img.depth()>8)
    		return Rect();
    	// --[2] 初始化变量
    	int edge[4];
    	edge[0] = center.y + 1;//top
    	edge[1] = center.x + 1;//right
    	edge[2] = center.y - 1;//bottom
    	edge[3] = center.x - 1;//left
    						   //[2]
    						   // --[3]边界扩展(中心扩散法)
     
    	bool EXPAND[4] = { 1,1,1,1 };//扩展标记位
    	int n = 0;
    	while (EXPAND[0] || EXPAND[1] || EXPAND[2] || EXPAND[3])
    	{
    		int edgeID = n % 4;
    		EXPAND[edgeID] = expandEdge(img, edge, edgeID);
    		n++;
    	}
    	//[3]
    	//qDebug() << edge[0] << edge[1] << edge[2] << edge[3];
    	Point tl = Point(edge[3], edge[0]);
    	Point br = Point(edge[1], edge[2]);
    	return Rect(tl, br);
    }
     
     
     
     
    int main()
    {
     
    	bool isExistence = false;
    	float first_area = 0;
    	/// 加载源图像
    	Mat src;
    	src = imread("cen.bmp", 1);
    	//src = imread("C:\\Users\\Administrator\\Desktop\\测试图片\\xxx\\20190308152516.jpg",1);
    	//src = imread("C:\\Users\\Administrator\\Desktop\\测试图片\\xx\\20190308151912.jpg",1);
    	//src = imread("C:\\Users\\Administrator\\Desktop\\测试图像\\2\\BfImg17(x-247 y--91 z--666)-(492,280).jpg",1);
    	cvtColor(src, src, CV_RGB2GRAY);
    	threshold(src, src, 100, 255, THRESH_BINARY);
    	Rect ccomp;
    	Point center(src.cols / 2, src.rows / 2);
    	//floodFill(src, center, Scalar(255, 255, 55), &ccomp, Scalar(20, 20, 20), Scalar(20, 20, 20));
    	if (src.empty())
    	{
    		cout << "fali" << endl;
    	}
    	//resize(src, src, cv::Size(496, 460), cv::INTER_LINEAR);
    	imshow("src", src);
    	Rect rr = InSquare(src, center);
    	rectangle(src, rr, Scalar(255), 1, 8);
    	imshow("src2", src);
     
    	waitKey(0);
    	getchar();
    	return 0;
    }

    原图和效果图:

    展开全文
  • 参考: ...这个可能不是最大内接矩形。 输入图像: 输出图像: 代码: public void Main() { Mat src = Cv2.ImRead(FilePath.Image.Shapes, ImreadModes.AnyColor); Mat gray = new Ma..

    参考:

    https://blog.csdn.net/qq_35054151/article/details/88952728

    注意:

    这个可能不是最大内接矩形。

    输入图像 :

    输出图像:

     代码:

            public void Main()
            {
                Mat src = Cv2.ImRead(FilePath.Image.Shapes, ImreadModes.AnyColor);
                Mat gray = new Mat();
                Mat binary = new Mat();
                Cv2.CvtColor(src, gray, ColorConversionCodes.RGB2GRAY);
                Cv2.Threshold(gray, binary, 10, 255, ThresholdTypes.Binary);
                ConnectedComponents cc = Cv2.ConnectedComponentsEx(binary);
                foreach (var maxBlob in cc.Blobs.Skip(1))
                {
                    Mat m = new Mat(binary, maxBlob.Rect);
                    Rect rr = InSquare(m, new Point(m.Width / 2, m.Height / 2));
                    Cv2.Rectangle(src, new Rect(maxBlob.Left + rr.Left, maxBlob.Top + rr.Top, rr.Width, rr.Height), Scalar.Red);
                }
                
            }
    
            /// <summary>
            /// 内接矩形
            /// </summary>
            /// <param name="img"></param>
            /// <param name="center"></param>
            /// <returns></returns>
            Rect InSquare(Mat img, Point center)
            {
    
                int[] edge = new int[4];
                edge[0] = center.Y - 1;//top
                edge[1] = center.X + 1;//right
                edge[2] = center.Y + 1;//bottom
                edge[3] = center.X - 1;//left
     
                bool[] EXPAND = { true, true, true, true };
                int n = 0;
                while (EXPAND[0] || EXPAND[1] || EXPAND[2] || EXPAND[3])
                {
                    int edgeID = n % 4;
                    EXPAND[edgeID] = ExpandEdge(img, edge, edgeID, EXPAND);
                    n++;
    
                }
    
    
                Point tl = new Point(edge[3], edge[0]);
                Point br = new Point(edge[1], edge[2]);
                return new Rect(tl, new Size(br.X - tl.X, br.Y - tl.Y));
            }
    
            /// <summary>
            /// 扩展边界函数
            /// </summary>
            /// <param name="img"></param>
            /// <param name="edge">边界数组,存放4条边界值</param>
            /// <param name="edgeID">当前边界号</param>
            /// <returns>确定当前边界是否可以扩展</returns>
            bool ExpandEdge(Mat img, int[] edge, int edgeID, bool[] EXPAND)
            {
    
    
                int width = img.Width;
                int height = img.Height;
    
                switch (edgeID)
                {
    
                    //top
                    case 0:
                        if (!EXPAND[0]) return false;
                        if (edge[0] <= 1)
                            return false;
                        for (int i = edge[3] + 1; i < edge[1]; ++i) // left - right
                        {
                            if (img.Get<byte>(edge[0], i) == 0)
                            {
                                Console.WriteLine("top");
    
                                return false;
                            }
                            else
                                img.Set<byte>(edge[0], i, 100);
                        }
                        edge[0]--;
                        return true;
                    //right
                    case 1:
                        if (!EXPAND[1]) return false;
                        if (edge[1] >= width)
                            return false;
                        for (int i = edge[0] + 1; i < edge[2]; ++i)   // top - bottom
                        {
                            if (img.Get<byte>(i, edge[1]) == 0)
                            {
                                Console.WriteLine("right");
                                return false;
                            }
                            else
                                img.Set<byte>(i, edge[1], 50);
                        }
                        edge[1]++;
                        return true;
    
                    //botton
                    case 2:
                        if (!EXPAND[2]) return false;
                        if (edge[2] >= height)
                            return false;
                        for (int i = edge[3] + 1; i < edge[1]; ++i)  // left - right
                        {
                            if (img.Get<byte>(edge[2], i) == 0)
                            {
                                Console.WriteLine("botton");
                                return false;
                            }
                            else
                                img.Set<byte>(edge[2], i, 100);
                        }
                        edge[2]++;
                        return true;
    
                    //left
                    case 3:
                        if (!EXPAND[3]) return false;
                        if (edge[3] < 1)
                            return false;
                        for (int i = edge[0] + 1; i < edge[2]; ++i) // top - bottom
                        {
                            if (img.Get<byte>(i, edge[3]) == 0)
                            {
                                Console.WriteLine("left");
                                return false;
                            }
                            else
                                img.Set<byte>(i, edge[3], 50);
                        }
                        edge[3]--;
                        return true;
    
                    default:
                        return false;
    
                }
    
            }

     

    展开全文
  • opencv最大内接矩形笔记

    千次阅读 2019-04-01 17:30:29
    } } /** * @brief 求取连通区域接矩 * @param img:输入图像,单通道二值图,深度为8 * @param center:最小外接矩的中心 * @return 最大内接矩形 * 基于中心扩展算法 */ cv::Rect InSquare(Mat &img, const Point ...
    
    
    
    #include<opencv2\opencv.hpp>
    #include <iostream>
    #include<vector>
    
    using namespace cv;
    using namespace std;
    
    /**
    
    * @brief expandEdge 扩展边界函数
    
    * @param img:输入图像,单通道二值图,深度为8
    
    * @param edge  边界数组,存放4条边界值
    
    * @param edgeID 当前边界号
    
    * @return 布尔值 确定当前边界是否可以扩展
    
    */
    
    bool expandEdge(const Mat & img, int edge[], const int edgeID)
    {
    	//[1] --初始化参数
    	int nc = img.cols;
    	int nr = img.rows;
    	switch (edgeID) {
    	case 0:
    		if (edge[0]>nr)
    			return false;
    		for (int i = edge[3]; i <= edge[1]; ++i)
    		{
    			if (img.at<uchar>(edge[0], i) == 255)//遇见255像素表明碰到边缘线
    				return false;
    		}
    		edge[0]++;
    		return true;
    		break;
    	case 1:
    		if (edge[1]>nc)
    			return false;
    		for (int i = edge[2]; i <= edge[0]; ++i)
    		{
    			if (img.at<uchar>(i, edge[1]) == 255)//遇见255像素表明碰到边缘线
    				return false;
    		}
    		edge[1]++;
    		return true;
    		break;
    	case 2:
    		if (edge[2]<0)
    			return false;
    		for (int i = edge[3]; i <= edge[1]; ++i)
    		{
    			if (img.at<uchar>(edge[2], i) == 255)//遇见255像素表明碰到边缘线
    				return false;
    		}
    		edge[2]--;
    		return true;
    		break;
    	case 3:
    		if (edge[3]<0)
    			return false;
    		for (int i = edge[2]; i <= edge[0]; ++i)
    		{
    			if (img.at<uchar>(i, edge[3]) == 255)//遇见255像素表明碰到边缘线
    				return false;
    		}
    		edge[3]--;
    		return true;
    		break;
    	default:
    		return false;
    		break;
    	}
    
    }
    
    /**
    
    * @brief 求取连通区域内接矩
    
    * @param img:输入图像,单通道二值图,深度为8
    
    * @param center:最小外接矩的中心
    
    * @return  最大内接矩形
    
    * 基于中心扩展算法
    
    */
    
    cv::Rect InSquare(Mat &img, const Point center)
    {
    	// --[1]参数检测
    	if (img.empty() ||img.channels()>1|| img.depth()>8)
    		return Rect();
    	// --[2] 初始化变量
    	int edge[4];
    	edge[0] = center.y + 1;//top
    	edge[1] = center.x + 1;//right
    	edge[2] = center.y - 1;//bottom
    	edge[3] = center.x - 1;//left
    						   //[2]
    						   // --[3]边界扩展(中心扩散法)
    
    	bool EXPAND[4] = { 1,1,1,1 };//扩展标记位
    	int n = 0;
    	while (EXPAND[0] || EXPAND[1] || EXPAND[2] || EXPAND[3])
    	{
    		int edgeID = n % 4;
    		EXPAND[edgeID] = expandEdge(img, edge, edgeID);
    		n++;
    	}
    	//[3]
    	//qDebug() << edge[0] << edge[1] << edge[2] << edge[3];
    	Point tl = Point(edge[3], edge[0]);
    	Point br = Point(edge[1], edge[2]);
    	return Rect(tl, br);
    }
    
    
    
    
    int main()
    {
    
    	bool isExistence = false;
    	float first_area = 0;
    	/// 加载源图像
    	Mat src;
    	src = imread("cen.bmp", 1);
    	//src = imread("C:\\Users\\Administrator\\Desktop\\测试图片\\xxx\\20190308152516.jpg",1);
    	//src = imread("C:\\Users\\Administrator\\Desktop\\测试图片\\xx\\20190308151912.jpg",1);
    	//src = imread("C:\\Users\\Administrator\\Desktop\\测试图像\\2\\BfImg17(x-247 y--91 z--666)-(492,280).jpg",1);
    	cvtColor(src, src, CV_RGB2GRAY);
    	threshold(src, src, 100, 255, THRESH_BINARY);
    	Rect ccomp;
    	Point center(src.cols / 2, src.rows / 2);
    	//floodFill(src, center, Scalar(255, 255, 55), &ccomp, Scalar(20, 20, 20), Scalar(20, 20, 20));
    	if (src.empty())
    	{
    		cout << "fali" << endl;
    	}
    	//resize(src, src, cv::Size(496, 460), cv::INTER_LINEAR);
    	imshow("src", src);
    	Rect rr = InSquare(src, center);
    	rectangle(src, rr, Scalar(255), 1, 8);
    	imshow("src2", src);
    
    	waitKey(0);
    	getchar();
    	return 0;
    }
    

    原图和效果图:

    展开全文
  • 最小外接矩形--最大内接矩形

    千次阅读 2020-01-09 20:51:44
    最小外接矩形 ... 最大内接矩形 https://gis.stackexchange.com/questions/59215/how-to-find-the-maximum-area-rectangle-inside-a-convex-polygon...
    展开全文
  • OPENCV C++ 找到最大内接矩形(正方形)

    千次阅读 2020-04-27 09:34:50
    OPENCV-C++ 找到最大内接矩形(正方形) 这源代码本来是检测最大接圆形的,本人想要矩形,所以变成了正方形;谨慎使用;不是严格意义上的最大内接矩形; cv::Mat map_one_label = cv::imread("src.png",cv2.IMREAD_...
  • 求区域的最大内接矩形

    千次阅读 2020-03-26 16:07:34
    采用中心往外扩张的方法,目前是特定的场景下使用。 bool expandEdge(const Mat & img, int edge[], const int edgeID, bool EXPAND[]) { //[1] --初始化参数 int nc = img.cols; int nr = img.rows;...
  • 计算多边形最大矩形的c++代码,只有一个头文件,要用到OpenCV+STL,有例程,根据网上代码(QT版C++代码)修改而成,修改内容包括: 1. 把QT的东西用OpenCV和STL替换 2. 去掉了部分bug 3. 注释掉了部分代码 4. ...
  • 求解旋转图像的最大内接矩形

    万次阅读 2016-05-27 12:45:21
    在机器学习和深度学习中,通常使用为了增加数据(Data Augmentation)可以对数据进行例如一系列的旋转(rotate)、镜像(flip)等操作,本文将讲解如何求取旋转图像的最大内接矩形问题。
  • opencv:求区域的内接矩形

    万次阅读 2016-11-08 17:09:42
    实验室项目中,希望求... 为获取较为准确的质心,拟用最大内接矩形的中心作为该区域质心。  采用改进的中心扩散法求内接矩形:先以最小外接矩的中心作为算法的起点进行中心扩散。得到一个解矩形,在对最小外接矩的
  • 将网上计算多边形最大矩形的java源码翻译成为c++/qt源.
  • 用莫比乌斯带巧解内接矩形问题:拓扑学的用处。——3Blue1Brown 以下图片部分来自视频。 问题描述 在一个平面上,有一个首尾相接的、与自身无交点的曲线,求证:在这个曲线上,至少存在一组点 A,B,C,DA,B,C,DA,B,...
  • 绘制如上图片的最小内接矩阵: def draw_min_rect_rectangle(mask_path): image = cv2.imread(mask_path) thresh = cv2.Canny(image, 128, 256) contours, hierarchy = cv2.findContours(thresh, cv2.RETR_...
  • 紧接着,我们想问:是否任意一个多边形都能找到内接矩形呢?有意思的是,答案也是肯定的。但此时,前一节我们用到的两种证明方法现在都派不上用场了,我们需要用到一些全新的手段。下面这个证明真可谓是巧妙到了...
  • 正交矩形就是四个边平行于坐标轴的矩形。请问这个用什么算法实现呀?
  • 多边形最小外接矩形算法 程鹏飞 题目 给出求一个多边形最小外接矩形的算法并证明求得的是最小外接矩形. 最小外接矩形英文简称为SMBR(smallest minimum bounding rectangle,它和MBR(minimum bounding rectangle)不...
  • RQNOJ 698(矩形计数-圆内接矩形数)

    千次阅读 2013-03-17 10:02:33
    题目:矩形计数 问题编号:698 题目描述 给出圆周上的N个点,请你计算出以这些点中的任意四个为四个角,能构成多少个矩形。 点的坐标是这样描述的,给定一个数组v[1..N],假设圆心为(0,0),圆的周长C=∑v...
  • 趣题:切圆与最大内接矩形

    千次阅读 2007-09-23 11:24:00
    看图,DEFG为直角三角形ABC的内接矩形,三个切圆的半径从小到大依次为r1, r2和r3。证明:当内接矩形的面积达到最大时,r1^2 + r2^2 = r3^2。 四个直角三角形ABC, EDC, AEF, DBG显然相似,切圆半径与边长一样...
  • 计算任意凸多边形最大矩形

    千次阅读 2019-07-10 18:08:12
    转自:https://blog.csdn.net/rosone/article/details/7796535 Computing the largest orthogonal rectangle in a convex polygon CS507A - Computational Geometry Fall 2003 - Course Project byDaniel Sud ...
  • 寻找多边形内部的最大矩形

    千次阅读 热门讨论 2020-01-19 16:26:53
    如题。 最后实现效果如下:
  • 当得到对象轮廓后,可用boundingRect()得到包覆此轮廓的最小正矩形,minAreaRect()得到包覆轮廓的最小斜矩形。 1)Rect boundingRect(InputArray points) points:输入信息,可以为包含点的容器(vector)或是Mat。 ...
  • 可通过像元的中心来确定该像元是位于矩形的内部还是矩形的外部。如果中心位于矩形轮廓的内部,则即使部分像元落在矩形之外,也会将此像元视为完全处于矩形内部。
  • DOS界面,找图像中最大的轮廓、画外接矩形,计算矩形
  • 概要 innerRect() 功能 获取多边形最大内接矩形 示例 获取多边形的最大内接矩形并设置其颜色为红色 Lot--> innerRect color("#ff0000")
  • 动态规划-直方图最大矩形

    千次阅读 2017-08-26 21:57:02
    题目来源:直方图最大矩形 有一个直方图,用一个整数数组表示,其中每列的宽度为1,求所给直方图包含的最大矩形面积。比如,对于直方图[2,7,9,4],它所包含的最大矩形的面积为14(即[7,9]包涵的7x2的矩形)。 给定一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 157,324
精华内容 62,929
关键字:

内接矩形