我想输出一个蓝色的手,但得到不正确的输出.我已经包含输入图片,错误的输出图片和下面的代码.
我认为下面的代码不会填满整个图像,因为图像在右边界尚未关闭.
如何关闭形状并正确填充蓝色?

#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, …Run Code Online (Sandbox Code Playgroud) 可能重复:
了解openCV 2.4中感兴趣的区域
我想从图像(Mat格式)获得一个子图像(由下面的红框限定).我该怎么做呢?

这是我目前的进展:
include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat imgray, thresh;
vector<vector<Point> >contours;
vector<Point> cnt;
vector<Vec4i> hierarchy;
Point leftmost;
Mat im = imread("igoy1.jpg");
cvtColor(im, imgray, COLOR_BGR2GRAY);
threshold(imgray, thresh, 127, 255, 0);
findContours(thresh, contours, hierarchy, RETR_TREE,CHAIN_APPROX_SIMPLE);
}
Run Code Online (Sandbox Code Playgroud) 我一直在做一些皮肤检测,但无法顺利进行.下面的图像包含输入(左)和输出(右),使用下面附带的代码.现在,所需的输出应该是最底部的图像(边缘光滑且没有孔的图像).我如何实现此输出?从哪里开始的示例代码将有很大帮助.
输入(左)和不正确的输出(右):

期望的输出:

用于生成Incorect输出的代码:
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main(){
Mat src = imread("qq.jpg");
if (src.empty())
return -1;
blur( src, src, Size(3,3) );
Mat hsv;
cvtColor(src, hsv, CV_BGR2HSV);
Mat bw;
inRange(hsv, Scalar(0, 10, 60), Scalar(20, 150, 255), bw);
imshow("src", src);
imshow("dst", bw);
waitKey(0);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
修改后的代码(在Astor的建议之后):(现在的问题是:你如何平滑输出?)
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int findBiggestContour(vector<vector<Point> >);
int main(){
Mat src = imread("qq.jpg");
if (src.empty())
return -1;
blur( src, src, Size(3,3) );
Mat hsv;
cvtColor(src, hsv, CV_BGR2HSV); …Run Code Online (Sandbox Code Playgroud) 我想提取手的边缘,但我得到以下结果.我已经尝试调整低和高阈值,但我仍然无法获得所需的输出.我在下面列出了代码及其输出.什么似乎是问题?
这是由下面的代码生成的输出图像.
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
int main(){
cv::Mat image= cv::imread("open_1a.jpg");
cv::Mat contours;
cv::Mat gray_image;
cvtColor( image, gray_image, CV_RGB2GRAY );
cv::Canny(image,contours,10,350);
cv::namedWindow("Image");
cv::imshow("Image",image);
cv::namedWindow("Gray");
cv::imshow("Gray",gray_image);
cv::namedWindow("Canny");
cv::imshow("Canny",contours);
cv::waitKey(0);
}
Run Code Online (Sandbox Code Playgroud) 你如何使用OpenCV获得不规则形状的质心?
我想知道OpenCV函数的src(source)和dst(destination)是否有不同的变量会对处理时间产生影响.我在下面有两个函数可以做同样的事情.
public static Mat getY(Mat m){
Mat mMattemp = new Mat();
Imgproc.cvtColor(m,mMattemp,Imgproc.COLOR_YUV420sp2RGB);
Imgproc.cvtColor(mMattemp,mMattemp, Imgproc.COLOR_RGB2HSV);
Core.inRange(mMattemp, new Scalar(20, 100, 100), new Scalar(30, 255, 255), mMattemp);
return mMattemp;
}
Run Code Online (Sandbox Code Playgroud)
与
public static Mat getY(Mat m){
Mat mMattemp_rgb = new Mat();
Mat mMattemp_hsv = new Mat();
Mat mMattemp_ir = new Mat();
Imgproc.cvtColor(m,mMattemp_rgb,Imgproc.COLOR_YUV420sp2RGB);
Imgproc.cvtColor(mMattemp_rgb,mMattemp_hsv, Imgproc.COLOR_RGB2HSV);
Core.inRange(mMattemp_hsv, new Scalar(20, 100, 100), new Scalar(30, 255, 255), mMattemp_ir);
return mMattemp_ir;
}
Run Code Online (Sandbox Code Playgroud)
哪两个更好?一个优于另一个的优势是什么?
我希望手形图像是手的黑白形状.这是输入和所需输出的示例:手黑白http://imageshack.us/a/img853/4017/handtobw.jpg
使用阈值不会产生所需的输出,因为手内的一些颜色与背景颜色相同.我怎样才能获得所需的输出?