C++ OpenCV关闭形状并填充它
我想输出一个蓝色填充的手,但得到的输出不正确。我在下面包括了输入图片、不正确的输出图片和代码 我认为下面的代码并没有填充整个图像,因为图像的右边界尚未闭合 如何关闭形状并正确填充蓝色C++ OpenCV关闭形状并填充它,c++,opencv,shape,fill,contour,C++,Opencv,Shape,Fill,Contour,我想输出一个蓝色填充的手,但得到的输出不正确。我在下面包括了输入图片、不正确的输出图片和代码 我认为下面的代码并没有填充整个图像,因为图像的右边界尚未闭合 如何关闭形状并正确填充蓝色 #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> #in
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace cv;
using namespace std;
void drawStuff();
void showInputWindow();
void showCannyWindow();
void showContourWindow();
int thresh = 40;
int max_thresh = 120;
Mat img_rgb,img_gray,img_bw,canny_output,drawing;
int main(){
img_rgb = imread("qq.jpg");
blur( img_rgb, img_rgb, Size(3,3) );
cvtColor(img_rgb,img_gray,CV_RGB2GRAY);
showInputWindow();
drawStuff();
cv::waitKey(0);
}
void drawStuff(){
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
Canny( img_gray, canny_output, thresh, thresh*2, 3 );
cv::dilate(canny_output, canny_output, cv::Mat(), cv::Point(-1,-1));
showCannyWindow();
findContours( canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
drawing = Mat::zeros( canny_output.size(), CV_8UC3 );
vector<Point> approxShape;
for(size_t i = 0; i < contours.size(); i++){
approxPolyDP(contours[i], approxShape, arcLength(Mat(contours[i]), true)*0.04, true);
drawContours(drawing, contours, i, Scalar(255, 0, 0), CV_FILLED); // fill BLUE
}
showContourWindow();
}
void showInputWindow(){
cv::namedWindow("InputImage");
cv::imshow("InputImage",img_rgb);
}
void showCannyWindow(){
cv::namedWindow("Canny");
cv::imshow("Canny",canny_output);
}
void showContourWindow(){
cv::namedWindow("Fill");
cv::imshow("Fill",drawing);
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间cv;
使用名称空间std;
空抽物();
void showInputWindow();
void showCannyWindow();
空窗口();
int thresh=40;
int max_thresh=120;
Mat img_rgb、img_gray、img_bw、canny_输出、绘图;
int main(){
img_rgb=imread(“qq.jpg”);
模糊(img_rgb,img_rgb,大小(3,3));
CVT颜色(img_rgb、img_gray、CV_RGB2GRAY);
showInputWindow();
抽丝();
cv::waitKey(0);
}
空抽{
矢量等值线;
向量层次;
Canny(img_灰度,Canny_输出,thresh,thresh*2,3);
扩张(canny_输出,canny_输出,cv::Mat(),cv::Point(-1,-1));
showCannyWindow();
findContours(canny_输出、轮廓、层次、CV_RETR_树、CV_链近似_简单、点(0,0));
drawing=Mat::zeros(canny_output.size(),CV_8UC3);
向量逼近形状;
对于(size_t i=0;i
要解决您的问题,您应该只检测外部轮廓。通过这样做,你将只得到一个轮廓,你可以用你的颜色填充它
findContours( canny_output, contours, hierarchy, Imgproc.RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
我认为问题是在手里面检测到了轮廓。尝试反向方法-填充周围环境,然后将其反转。如何填充周围环境?使用一些不同的颜色(如绿色)仅绘制轮廓(未填充),然后使用左上角的种子填充(坐标0,0)并用蓝色填充。然后遍历图像,用黑色替换蓝色像素,用蓝色替换黑色或绿色像素。是的,轮廓上可能有洞。尝试先使用CVExplate,然后再使用CVExpore来闭合小间隙。
CVExpore(src,dst,NULL,1)
,与CVExplate相同。“1”表示将闭合多大的间隙(以像素为单位)。