首页 > 编程知识 正文

opencv多边形,opencv轮廓分割成直线圆弧

时间:2023-05-06 02:55:34 阅读:210300 作者:2754


本文由@星沉阁冰不语出品,转载请注明作者和出处。

文章链接:http://blog.csdn.net/xingchenbingbuyu/article/details/50719569

微博:http://weibo.com/xingchenbing 


之前对于Opencv的学习,一直是一种查找资料然后运行别人的代码的状态。自己最多修改个变量什么的。直到上学期期末的时候才开始有意识地给自己让自己解决一些自己提出的问题。也许在大神们看来这些问题太多简单甚至幼稚,但是这就是现在的我给自己找的一些问题。能发出来的都是解决的,还有很多没有解决暂时没办法发出来。只能等不知道什么时候的以后,实现之后再发出来了。现在除了这些小练习之外,还在做的就是实现何凯明的暗通道去雾算法。有一些bug一旦出现,以我现阶段的能力解决起来很耗时间。但也是没办法的事情。

今天继续昨天的对角分割,想到了分割出来一个圆形区域。于是就很简单的实现了一下。思想还是利用数学公式判断点是否在圆内还是圆外。

代码如下:

#include<opencv2corecore.hpp>#include<opencv2highguihighgui.hpp>#include<opencv2imgprocimgproc.hpp>#include<iostream>using namespace cv;using namespace std;int main(int argc,char* argv[]){Mat image = imread("miao.jpg");Mat image1(image.rows, image.cols, image.type(), Scalar(180, 120, 50));Mat image2(image.rows, image.cols, image.type(), Scalar(180, 120, 50));Point center(image.cols/2,image.rows/2);int radius = 200;circle(image, center, radius, Scalar(0, 200, 100), 2, 8, 0);for (int x = 0; x < image.cols; x++){for (int y = 0; y < image.rows; y++){int temp = ((x - center.x) * (x - center.x) + (y - center.y) *(y - center.y));if (temp < (radius * radius)){image1.at<Vec3b>(Point(x, y))[0] = image.at<Vec3b>(Point(x, y))[0];image1.at<Vec3b>(Point(x, y))[1] = image.at<Vec3b>(Point(x, y))[1];image1.at<Vec3b>(Point(x, y))[2] = image.at<Vec3b>(Point(x, y))[2];}else{image2.at<Vec3b>(Point(x, y))[0] = image.at<Vec3b>(Point(x, y))[0];image2.at<Vec3b>(Point(x, y))[1] = image.at<Vec3b>(Point(x, y))[1];image2.at<Vec3b>(Point(x, y))[2] = image.at<Vec3b>(Point(x, y))[2];}}}imshow("image1", image1);imshow("image2", image2);while (uchar(waitKey() != 'q')) {}return 0;}


代码很简单不需要什么注释,唯一需要注意的一点就是再选取中心点的时候,

注意Point  center(image.rows/2,image.cols/2)和Point  center(image.cols/2,image.rows/2)的区别。后者才是中心点。
效果图如下:





由于非常简单,于是顺带也实现下矩形分割吧,反正足够简单。代码如下:

#include<opencv2corecore.hpp>#include<opencv2highguihighgui.hpp>#include<opencv2imgprocimgproc.hpp>#include<iostream>using namespace cv;using namespace std;int main(int argc,char* argv[]){Mat image = imread("miao.jpg");Mat image1(image.rows, image.cols, image.type(), Scalar(180, 120, 50));Mat image2(image.rows, image.cols, image.type(), Scalar(180, 120, 50));Point point1(140,40);Point point2(470, 340);for (int x = 0; x < image.cols; x++){for (int y = 0; y < image.rows; y++){if (point1.x <= x && x<=point2.x && point1.y<=y && y<=point2.y){image1.at<Vec3b>(Point(x, y))[0] = image.at<Vec3b>(Point(x, y))[0];image1.at<Vec3b>(Point(x, y))[1] = image.at<Vec3b>(Point(x, y))[1];image1.at<Vec3b>(Point(x, y))[2] = image.at<Vec3b>(Point(x, y))[2];}else{image2.at<Vec3b>(Point(x, y))[0] = image.at<Vec3b>(Point(x, y))[0];image2.at<Vec3b>(Point(x, y))[1] = image.at<Vec3b>(Point(x, y))[1];image2.at<Vec3b>(Point(x, y))[2] = image.at<Vec3b>(Point(x, y))[2];}}}namedWindow("image1", 0);namedWindow("image2", 0);imshow("image", image);imshow("image1", image1);imshow("image2", image2);while (uchar(waitKey() != 'q')) {}return 0;}


效果图如下:





其实本来想要添加一些鼠标交互的,比如用鼠标选取圆心,选取矩形等,但是没有成功。我还得继续修炼。





版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。