1. 程式人生 > >OpenCV實踐之路——圓形切割和矩形切割

OpenCV實踐之路——圓形切割和矩形切割

本文由@星沉閣冰不語出品,轉載請註明作者和出處。

之前對於Opencv的學習,一直是一種查詢資料然後執行別人的程式碼的狀態。自己最多修改個變數什麼的。直到上學期期末的時候才開始有意識地給自己讓自己解決一些自己提出的問題。也許在大神們看來這些問題太多簡單甚至幼稚,但是這就是現在的我給自己找的一些問題。能發出來的都是解決的,還有很多沒有解決暫時沒辦法發出來。只能等不知道什麼時候的以後,實現之後再發出來了。現在除了這些小練習之外,還在做的就是實現何凱明的暗通道去霧演算法。有一些bug一旦出現,以我現階段的能力解決起來很耗時間。但也是沒辦法的事情。

今天繼續昨天的對角分割,想到了分割出來一個圓形區域。於是就很簡單的實現了一下。思想還是利用數學公式判斷點是否在圓內還是圓外。

程式碼如下:

#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 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;
	
}

效果圖如下:



其實本來想要新增一些滑鼠互動的,比如用滑鼠選取圓心,選取矩形等,但是沒有成功。我還得繼續修煉。