Image processing 如何使用opencv查找凸面缺陷?
我有以下代码Image processing 如何使用opencv查找凸面缺陷?,image-processing,opencv,contour,convex-hull,Image Processing,Opencv,Contour,Convex Hull,我有以下代码 #include"opencv2/opencv.hpp" #include<iostream> #include<math.h> using namespace std; using namespace cv; main() { Mat img1,img2,sub,gray1,gray2,lab,ycbcr; int v[3]; int row,col,i,j
#include"opencv2/opencv.hpp"
#include<iostream>
#include<math.h>
using namespace std;
using namespace cv;
main()
{
Mat img1,img2,sub,gray1,gray2,lab,ycbcr;
int v[3];
int row,col,i,j,t;
VideoCapture cap(0);
namedWindow("current");
cap>>img1;
sub=img1;
row=img1.rows;
col=img1.cols;
cvtColor(img1,gray1,CV_BGR2GRAY);
vector<vector<Point> > cont;
vector<Vec4i> hierarchy;
while (1) {
cap>>img2;
cvtColor(img2,gray2,CV_BGR2GRAY);
for(i=0;i<row;++i)
{
for (j=0; j<col; ++j)
{
if(abs(gray1.at<uchar>(i,j) - gray2.at<uchar>(i,j))>10)
{
sub.at<Vec3b>(i,j)[0] = img2.at<Vec3b>(i,j)[0];
sub.at<Vec3b>(i,j)[1] = img2.at<Vec3b>(i,j)[1];
sub.at<Vec3b>(i,j)[2] = img2.at<Vec3b>(i,j)[2];
}
else
{
sub.at<Vec3b>(i,j)[0]=0;
sub.at<Vec3b>(i,j)[1]=0;
sub.at<Vec3b>(i,j)[2]=0;
}
}
}
cvtColor(sub,ycbcr,CV_BGR2YCrCb);
inRange(ycbcr,Scalar(7,133,106),Scalar(255,178,129),ycbcr);
findContours(ycbcr,cont,hierarchy,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);
Scalar color = CV_RGB(255,255,255);
vector<vector<Point> > hullPoints(cont.size());
for( i = 0; i < cont.size(); i++ )
convexHull(cont[i],hullPoints[i],false);
for(i = 0 ;i >= 0; i = hierarchy[i][0] )
{
drawContours( ycbcr, cont, i, color,1, CV_AA, hierarchy );//for drawing contours
drawContours( ycbcr, hullPoints, i, color,2, CV_AA, hierarchy );//for drawing convex hull
}
flip(ycbcr,ycbcr,1);
imshow("current",ycbcr);
if(waitKey(33)=='q')
break;
img1=img2.clone();
}
}
#包括“opencv2/opencv.hpp”
#包括
#包括
使用名称空间std;
使用名称空间cv;
main()
{
Mat img1、img2、sub、灰色1、灰色2、实验室、ycbcr;
int v[3];
int row,col,i,j,t;
视频捕获上限(0);
名称(以下简称“当前”);
cap>>img1;
sub=img1;
row=img1.rows;
col=img1.cols;
CVT颜色(img1,灰色1,CV_bgr2灰色);
矢量控制;
向量层次;
而(1){
cap>>img2;
CVT颜色(img2,灰色2,CV_bgr2灰色);
对于(i=0;i=0;i=hierarchy[i][0])
{
绘制等高线(ycbcr、cont、i、color、1、CV_AA、层次);//用于绘制等高线
绘制轮廓(ycbcr,外壳点,i,颜色,2,CV_AA,层次);//用于绘制凸面外壳
}
翻转(ycbcr,ycbcr,1);
imshow(“当前”,ycbcr);
if(waitKey(33)='q')
打破
img1=img2.clone();
}
}
如何找到此凸出缺陷..cvConvexityDefects()需要const cvArr*作为参数。但我有来自凸出的向量点类型结果..因此如何键入cast..?您应该使用
向量类型进行凸出计算:
convexHull(Mat(contours), hullsI, false); // false means it will return the indices at which the hulls are found and not the point of the convex hull
然后打电话:
convexityDefects(contours, hullsI, defects);
近似
还有许多其他的问题:)希望这能有所帮助 您应该使用向量
类型进行凸出
计算:
convexHull(Mat(contours), hullsI, false); // false means it will return the indices at which the hulls are found and not the point of the convex hull
然后打电话:
convexityDefects(contours, hullsI, defects);
近似
还有许多其他的问题:)希望这能有所帮助 看看您正在使用的OpenCV的哪个版本?AFAIK cvConvexHull函数是遗留的,在新版本中,您应该使用cvConvexHull 2。OpenCV也有CvPoint、CvMat和CVSequence类型-为什么不使用它们,而不是合并std和OpenCV类型?看看您使用的是什么版本的OpenCV?AFAIK cvConvexHull函数是遗留的,在新版本中,您应该使用cvConvexHull 2。OpenCV也有CvPoint、CvMat和CVSequence类型-为什么不使用它们,而不是合并std和OpenCV类型?只是找到了帮助我解决相同问题的SO问题。刚发现的问题帮助我解决了同样的问题。