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


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

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

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


之前对于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;
	
}


效果图如下:





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





已标记关键词 清除标记
相关推荐
如题,对字符图片进行字符分割,采用的外轮廓最小外接矩形的方法,分割效果如图![图片说明](https://img-ask.csdn.net/upload/201506/05/1433478793_843497.png) 为什么顺序不是从右到左呀,这样没有顺序的分割没太有意义呀。请问有人知道怎么改成分割后结果顺序从右到左或者从左到右么,谢谢!!!!代码如下 #include "stdafx.h" #include "cv.h" #include "highgui.h" #include "cxcore.h" int main(int argc, char* argv[]) { IplImage* imgSrc = cvLoadImage("C:\\Users\\think\\Desktop\\腐蚀膨胀结果.jpg",CV_LOAD_IMAGE_COLOR); IplImage* img_gray = cvCreateImage(cvGetSize(imgSrc), IPL_DEPTH_8U, 1); cvCvtColor(imgSrc, img_gray, CV_BGR2GRAY); cvThreshold(img_gray, img_gray,100, 255,CV_THRESH_BINARY);// CV_THRESH_BINARY_INV使得背景为黑色,字符为白色,这样找到的最外层才是字符的最外层 cvShowImage("ThresholdImg",img_gray); CvSeq* contours = NULL; CvMemStorage* storage = cvCreateMemStorage(0); int count = cvFindContours(img_gray, storage, &contours,sizeof(CvContour),CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE,cvPoint(0,0)); printf("轮廓个数:%d",count); int idx = 0; char szName[56] = {0}; int tempCount=0; for (CvSeq* c = contours; c != NULL; c = c->h_next) { CvRect rc =cvBoundingRect(c,0); cvDrawRect(imgSrc, cvPoint(rc.x, rc.y), cvPoint(rc.x + rc.width, rc.y + rc.height), CV_RGB(255, 0, 0)); IplImage* imgNo = cvCreateImage(cvSize(rc.width, rc.height), IPL_DEPTH_8U, 3); cvSetImageROI(imgSrc, rc); cvCopyImage(imgSrc, imgNo); cvResetImageROI(imgSrc); sprintf(szName, "wnd_%d", idx++); cvNamedWindow(szName); cvShowImage(szName, imgNo); cvReleaseImage(&imgNo); } cvNamedWindow("src"); cvShowImage("src", imgSrc); cvWaitKey(0); cvReleaseMemStorage(&storage); cvReleaseImage(&imgSrc); cvReleaseImage(&img_gray); cvDestroyAllWindows(); return 0; }
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页