Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试获得与RegionProps openCV相同的结果 这是我试图在OpenCV C++中重新编码的MATLAB代码 起初的 _C++_Matlab_Opencv - Fatal编程技术网

尝试获得与RegionProps openCV相同的结果 这是我试图在OpenCV C++中重新编码的MATLAB代码 起初的

尝试获得与RegionProps openCV相同的结果 这是我试图在OpenCV C++中重新编码的MATLAB代码 起初的 ,c++,matlab,opencv,C++,Matlab,Opencv,黑白 Matlab结果 OpenCV结果 OpenCV等高线结果与matlab等高线结果类似: cDist=regionprops(bwImg,'Area'); cDist=[cDist.Area]; %为每个对象添加标签 [BwimgLabel,~]=BwimLabel(bwImg); %基于对颜色的假设计算最小和最大对象大小 %格子尺寸 maxLabelSize=产品(尺寸(图像数据)。/[4 6]); minLabelSize=产品(尺寸(图像数据)。/[4 6]。/10); %查

黑白

Matlab结果

OpenCV结果

OpenCV等高线结果与matlab等高线结果类似:

cDist=regionprops(bwImg,'Area');
cDist=[cDist.Area];
%为每个对象添加标签
[BwimgLabel,~]=BwimLabel(bwImg);
%基于对颜色的假设计算最小和最大对象大小
%格子尺寸
maxLabelSize=产品(尺寸(图像数据)。/[4 6]);
minLabelSize=产品(尺寸(图像数据)。/[4 6]。/10);
%查找太大或太小对象的标签索引
提醒=查找(cDist>maxLabelSize);
提醒=[提醒查找(cDist
这是我的密码:

bwImg.convertTo(bwImg,CV_8U);
cv::vector<cv::vector<cv::Point> > contours_1;
cv::findContours(bwImg,contours_1,CV_RETR_TREE,CV_CHAIN_APPROX_NONE,cv::Point(0,0));
//DEBUG contours
cv::Mat drawing1 = cv::Mat::zeros(bwImg.size(),CV_8UC3);    

for (int i = 0; i < contours_1.size(); i++)
{
    cv::RNG rng(12345);
    cv::Scalar color = cv::Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
    cv::drawContours(drawing1,contours_1,i,color,CV_FILLED);
}
//show contours update//
cv::imshow("contours",drawing1);        
cv::waitKey(0);

drawing1.release();
//% Calculate min and max object size based on assumptions on the color
//  % checker size
//  maxLabelSize = prod(size(imageData)./[4 6]);
//  minLabelSize = prod(size(imageData)./[4 6]./10);
double maxLabelSize = (bwImg.rows/4.0) * (bwImg.cols/6.0);
double minLabelSize = ((bwImg.rows/40.0) * (bwImg.cols/60.0));


//  % Remove over/undersized objects
//  for n=1:length(remInd)
//      ri = bwImgLabeled == remInd(n);
//      bwImgLabeled(ri) = 0;
//  end
cv::vector<cv::vector<cv::Point> > goodContours;
for (int i = 0; i < contours_1.size(); i++)
{
    double size = cv::contourArea(contours_1[i]);
    if (size < maxLabelSize && size > minLabelSize)
    {
        goodContours.push_back(contours_1[i]);
    }
}
bwImg.convertTo(bwImg,CV_8U);
向量轮廓_1;
cv::findContours(bwImg,等高线1,cv_RETR_树,cv_链约无,cv::Point(0,0));
//调试轮廓
cv::Mat drawing1=cv::Mat::Zero(bwImg.size(),cv_8UC3);
对于(int i=0;i<1.size();i++)
{
cv::RNG RNG(12345);
cv::Scalar color=cv::Scalar(规则一致(0255)、规则一致(0255)、规则一致(0255));
cv::drawContours(drawing1,contours_1,i,颜色,cv_填充);
}
//显示轮廓更新//
cv::imshow(“轮廓”,图纸1);
cv::waitKey(0);
图纸1.释放();
//%基于对颜色的假设计算最小和最大对象大小
//%棋盘格大小
//maxLabelSize=产品(尺寸(图像数据)。/[4 6]);
//minLabelSize=产品(尺寸(图像数据)。/[4 6]。/10);
double maxLabelSize=(bwImg.rows/4.0)*(bwImg.cols/6.0);
双minLabelSize=((bwImg.rows/40.0)*(bwImg.cols/60.0));
//%删除过大/过小的对象
//对于n=1:长度(提醒)
//ri=bwImgLabeled==提醒(n);
//bwImgLabeled(ri)=0;
//结束
矢量轮廓;
对于(int i=0;i<1.size();i++)
{
双尺寸=cv::轮廓面积(轮廓1[i]);
如果(大小minLabelSize)
{
好的轮廓。向后推(轮廓1[i]);
}
}

然而,我没有得到同样的结果。在matlab中,我得到了比openCV更多的轮廓。你能看到我的问题吗?

你能展示一下在opencv中进行区域过滤之前“轮廓”是什么样子吗?@AnderBiguri我添加了来自openCVComming的粉色轮廓图像,这些轮廓来自Matlab或opencv?这就是为什么
cv::imshow(“轮廓”,图纸1)显示?还可以看看@Gilad,所以基本上是Matlab和openCV计算的面积不匹配?尝试以下方法:将一张只有一个“轮廓”或白色斑点的图像放在一个已知区域,然后检查Matlab和opencv在
size
上返回的值。在opencv中进行区域过滤之前,你能展示“轮廓”是什么样子吗?@AnderBiguri I添加了openCVComming从Matlab或opencv中输出的粉色轮廓图像吗?这就是为什么
cv::imshow(“轮廓”,图纸1)显示?还可以看看@Gilad,所以基本上是Matlab和openCV计算的面积不匹配?尝试以下操作:将一张只有一个“轮廓”或白色斑点的图像放在一个已知区域,然后检查Matlab和opencv在
size
上返回的内容。
bwImg.convertTo(bwImg,CV_8U);
cv::vector<cv::vector<cv::Point> > contours_1;
cv::findContours(bwImg,contours_1,CV_RETR_TREE,CV_CHAIN_APPROX_NONE,cv::Point(0,0));
//DEBUG contours
cv::Mat drawing1 = cv::Mat::zeros(bwImg.size(),CV_8UC3);    

for (int i = 0; i < contours_1.size(); i++)
{
    cv::RNG rng(12345);
    cv::Scalar color = cv::Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
    cv::drawContours(drawing1,contours_1,i,color,CV_FILLED);
}
//show contours update//
cv::imshow("contours",drawing1);        
cv::waitKey(0);

drawing1.release();
//% Calculate min and max object size based on assumptions on the color
//  % checker size
//  maxLabelSize = prod(size(imageData)./[4 6]);
//  minLabelSize = prod(size(imageData)./[4 6]./10);
double maxLabelSize = (bwImg.rows/4.0) * (bwImg.cols/6.0);
double minLabelSize = ((bwImg.rows/40.0) * (bwImg.cols/60.0));


//  % Remove over/undersized objects
//  for n=1:length(remInd)
//      ri = bwImgLabeled == remInd(n);
//      bwImgLabeled(ri) = 0;
//  end
cv::vector<cv::vector<cv::Point> > goodContours;
for (int i = 0; i < contours_1.size(); i++)
{
    double size = cv::contourArea(contours_1[i]);
    if (size < maxLabelSize && size > minLabelSize)
    {
        goodContours.push_back(contours_1[i]);
    }
}