OpenCV实践之路——矩形图片的对角线分割

在假期之前曾试图实现矩形图片对角线分割这么一个简单的任务。结果正方形的实现了,详见 OpenCV实践之路——方形图片对角线切割。矩形的时候总是出现一些我不能理解的错误,大概值指针越界之类的。当时对于图像像素边界的理解非常有限,这就是所谓的历史局限性吧。今天借助IamgeWatch对像素进行了深入的探究之后,详见OpenCV实践之路——像素初探。对于像素操作的理解前所未有地清晰。于是再次去实现了一下矩形对角分割。

其实思想很简单,只是由于当时我水平还不够才觉得很难。就是做出对角线,然后判断,如果某一点在直线这一片,复制到image1,否则复制到image2。对于没有值另外一半,给其赋个值。我是选择的喵星人眼睛的颜色赋值的。

代码很简单:

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

using namespace cv;
using namespace std;

int main(int argc,char* argv[])
{
	Mat image = imread(argv[1]);	
	int x1 = 0, y1 = 0;
	int x2 = image.cols - 1, y2 = image.rows-1;
	
	Mat image1(image.rows, image.cols, CV_8UC3, Scalar(180,120,50));
	Mat image2(image.rows, image.cols, CV_8UC3, Scalar(180, 120, 50));

	for (int x = 0; x < image.cols; x++)
	{
		for (int y = 0; y < image.rows; y++)
		{	
			//如果在直线之下,赋值到image1,注意图片的坐标系y是越向下越大的
			if ((y - y2)*(x1 - x2) - (x - x2)*(y1 - y2) >= 0)
			{
				image1.at<Vec3b>(Point(x, y)) = image.at<Vec3b>(Point(x, y));
			}

			//如果在直线之上,复制到image2
			else
			{
				image2.at<Vec3b>(Point(x, y)) = image.at<Vec3b>(Point(x, y));
			}		
		}
	}
	imshow("image", image);
	imshow("image1", image1);
	imshow("image2", image2);

	while (char(waitKey(1)) != 'q'){}
	return 0;
	
}


效果如下图:

OpenCV实践之路——矩形图片的对角线分割_第1张图片


OpenCV实践之路——矩形图片的对角线分割_第2张图片

OpenCV实践之路——矩形图片的对角线分割_第3张图片


你可能感兴趣的:(C++,opencv,Visual,Studio)