gpt4 book ai didi

opencv - 如何在 Mat 的特定区域中查找非零像素

转载 作者:太空宇宙 更新时间:2023-11-03 21:34:28 24 4
gpt4 key购买 nike

我想在特定位置使用 findNonZero 函数查找非零像素,而不是整个 Mat。

在下面张贴的图片中,我用findContours 函数找到了白色补丁的区域。后来,我用 bitwise_not 函数反转了下面发布的图像,我需要为每个白色补丁分别找到那些黑色图案的像素位置。 我该怎么做?对于每个白色 block ,应该有一个带有黑色像素坐标的 Mat 或 Array。

enter image description here

我目前的方法是找到白色补丁的轮廓并将它们全部绘制到单独的垫子中。然后,使用 findNonZero 找到白色补丁白色像素的坐标,将图像与黑色图案混合并使用 for 循环检查像素是否为白色,现在是否为黑色。将这些像素的坐标放在一个列表中,然后再做其他事情......但是这种方法既不智能也不简单,效率也不高。

是否有可能更简单、更有效地做到这一点?就像能够在轮廓内找到 nonZero 像素一样?

最佳答案

您好,这是一个示例实现!请使用这个!

void findNonZero( InputArray _src, InputArray _Mask, OutputArray _idx )
{
Mat src = _src.getMat();
Mat msk = _Mask.getMat();
CV_Assert( src.type() == CV_8UC1 );
CV_Assert( src.size() == msk.size());

int n = countNonZero(src);
if( n == 0 )
{
_idx.release();
return;
}
if( _idx.kind() == _InputArray::MAT && !_idx.getMatRef().isContinuous() )
_idx.release();
_idx.create(n, 1, CV_32SC2);
Mat idx = _idx.getMat();
CV_Assert(idx.isContinuous());
Point* idx_ptr = idx.ptr<Point>();

for( int i = 0; i < src.rows; i++ )
{
const uchar* bin_ptr = src.ptr(i);
const uchar* msk_ptr = msk .ptr(i);
for( int j = 0; j < src.cols; j++ )
if( bin_ptr[j] && msk_ptr[j])
*idx_ptr++ = Point(j, i);
}
}

int _tmain(int argc, _TCHAR* argv[])
{
string sFileNameEx="F:\\Balaji\\Image Samples\\Test.jpg";
size_t lastindex = sFileNameEx.find_last_of(".");
String sFileName = sFileNameEx.substr(0, lastindex);
bool bSaveImages=true;

Mat mSrc_Gray,mSrc_Mask,mResult_Bgr;

mSrc_Gray= imread(sFileNameEx,0);
mSrc_Mask= Mat(mSrc_Gray.size(),CV_8UC1,Scalar(0));
cvtColor(mSrc_Gray,mResult_Bgr,COLOR_GRAY2BGR);


if(mSrc_Gray.empty())
{
cout<<"[Error]! Invalid Input Image";
return 0;
}

threshold(mSrc_Gray,mSrc_Gray,10,255,THRESH_BINARY);
imshow("mSrc_Gray",mSrc_Gray);

enter image description here

    vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
/// Find contours
findContours( mSrc_Gray.clone(), contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point(0, 0) );

for( size_t i = 0; i < contours.size(); i++ )
{
if(contourArea(contours[i])>500)
{
drawContours(mSrc_Mask,contours,i,Scalar(255),-1);
}
}

//May be further Filtering like erode needed?
imshow("mSrc_Mask",mSrc_Mask);

enter image description here

    vector<Point> locations;   // output, locations of non-zero pixels

findNonZero(mSrc_Gray,mSrc_Mask,locations);

for( size_t i = 0; i < locations.size(); i++ )
{
circle(mResult_Bgr,locations[i],1,Scalar(0,255,0),1);
}
imshow("mResult_Bgr",mResult_Bgr);

enter image description here

    waitKey(0);
return 0;
}

关于opencv - 如何在 Mat 的特定区域中查找非零像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38857480/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com