在假期之前曾试图实现矩形图片对角线分割这么一个简单的任务。结果正方形的实现了,详见 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; }