OpenCV实践之路——圆形切割和矩形切割

参考:http://blog.csdn.net/xingchenbingbuyu/article/details/50719569


圆分割

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

#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<iostream>

using namespace cv;
using namespace std;

int main(int argc,char* argv[])
{
    Mat image = imread("1.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<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.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;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值