opencv 윤곽 고 스 필터 부 드 러 움 실현

본 논문 의 사례 는 opencv 가 윤곽 고 스 필터 의 부 드 러 운 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
작은 테스트 문제:
그림 에서 점 을 선택 하여 점 선택 과 인접 한 색상 과 비슷 한 점 집합 을 찾 아 이 점 집합 에서 윤곽 을 추출 하고 이 점 집합 윤곽 을 부 드 럽 게 처리 하여 처리 결 과 를 표시 합 니 다.

#include <opencv2/opencv.hpp>
#include <iostream>
 
using namespace std;
using namespace cv;
 
 
//************************************
// Method: findRegion     
// FullName: findRegion
// Access: public 
// Returns: vector<Point>
// Qualifier:
// Parameter: Mat img
// Parameter: Point pos
// Parameter: int LowDifference
// Parameter: int UpDifference
//************************************
vector<Point> findRegion(Mat img, Point pos, int LowDifference, int UpDifference)
{
 Mat image = img.clone();
 Mat imgBack = img.clone();
 Rect ccomp;
 Scalar pixel = image.at<Vec3b>(pos);
 Scalar pixel2 = Scalar(255 - pixel[0], 255 - pixel[1], 255 - pixel[2], pixel[3]);
 floodFill(image, pos, pixel2, &ccomp, Scalar(LowDifference, LowDifference, LowDifference),
 Scalar(UpDifference, UpDifference, UpDifference));
 
 Mat diff;
 absdiff(image, imgBack, diff);
 
 //        
 vector<Point> pt;
 for (int i = 0; i < diff.rows; i++)
 {
 for (int j = 0; j < diff.cols; j++)
 {
 Point newPos(j, i);
 Scalar pixel3 = diff.at<Vec3b>(newPos);
 if (pixel3[0] != 0 || pixel3[1] != 0 || pixel3[2] != 0)
 {
 pt.push_back(newPos);
 }
 }
 }
 
 return pt;
}
 
//************************************
// Method: findPerimeter           
// FullName: findPerimeter
// Access: public 
// Returns: vector<Point>
// Qualifier:
// Parameter: vector<Point> pt
// Parameter: Size size
//************************************
vector<Point> findPerimeter(vector<Point> pt, Size size)
{
 Mat imgGray(size, CV_8UC1, Scalar(0));
 for (int i = 0; i < pt.size(); i++)
 {
 imgGray.at<uchar>(pt[i]) = 255;
 }
 
 std::vector<std::vector<cv::Point>> contours;
 //              
 cv::findContours(imgGray.clone(), contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
 
 return contours[0];
}
 
//************************************
// Method: displayImage     
// FullName: displayImage
// Access: public 
// Returns: void
// Qualifier:
// Parameter: Mat img
// Parameter: vector<Point> contours    
// Parameter: Point pos
//************************************
void displayImage(Mat img, vector<Point> contours, Point pos)
{
 Mat imgShow = img.clone();
 for (int i = 0; i < contours.size(); i++)
 {
 imgShow.at<Vec3b>(contours[i])[0] = 0;
 imgShow.at<Vec3b>(contours[i])[1] = 0;
 imgShow.at<Vec3b>(contours[i])[2] = 0;
 }
 
 circle(imgShow, pos, 3, Scalar(0, 0, 0), 1, 8, 0);//       
 
 imshow("img", imgShow);
 waitKey(0);
}
 
 
//************************************
// Method: findSmoothPeimeter          
// FullName: findSmoothPeimeter
// Access: public 
// Returns: void
// Qualifier:
// Parameter: Mat img   
// Parameter: vector<Point> pt      
//************************************
void findSmoothPeimeter(Mat img, vector<Point> pt)
{
 vector<Point> contours = findPerimeter(pt, img.size());
 
 Mat im;
 cvtColor(img, im, CV_BGR2GRAY);
 
 Mat cont = ~im;
 Mat original = Mat::zeros(im.rows, im.cols, CV_8UC3);
 Mat smoothed = img.clone();
 
 // contour smoothing parameters for gaussian filter
 int filterRadius = 10;
 int filterSize = 2 * filterRadius + 1;
 double sigma = 10;
 
 size_t len = contours.size() + 2 * filterRadius;
 size_t idx = (contours.size() - filterRadius);
 vector<float> x, y;
 for (size_t i = 0; i < len; i++)
 {
 x.push_back(contours[(idx + i) % contours.size()].x);
 y.push_back(contours[(idx + i) % contours.size()].y);
 }
 // filter 1-D signals
 vector<float> xFilt, yFilt;
 GaussianBlur(x, xFilt, Size(filterSize, filterSize), sigma, sigma);
 GaussianBlur(y, yFilt, Size(filterSize, filterSize), sigma, sigma);
 // build smoothed contour
 vector<Point> smoothContours;
 for (size_t i = filterRadius; i < contours.size() + filterRadius; i++)
 {
 smoothContours.push_back(Point(xFilt[i], yFilt[i]));
 }
 
 Scalar color;
 
 for (int i = 0; i < smoothContours.size(); i++)
 {
 smoothed.at<Vec3b>(smoothContours[i])[0] = 0;
 smoothed.at<Vec3b>(smoothContours[i])[1] = 0;
 smoothed.at<Vec3b>(smoothContours[i])[2] = 0;
 }
 
 imshow("smoothed", smoothed);
 waitKey(10);
}
 
void main()
{
 Mat img = imread("4.jpg", 1);
 
 vector<Point> pt, contours;
 Point pos(1438, 590);//    
 int para1 = 2;
 int para2 = 2;
 pt = findRegion(img, pos, para1, para2);
 findSmoothPeimeter(img, pt);
 
 contours = findPerimeter(pt, img.size());//     
 displayImage(img, contours, pos);//    
}

넘 치 는 물 로 찾 은 윤곽 을 채우다.

윤곽 필터
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기