OpenCVの新しい関数connectedComponents WithSttsの使い方について話します。
4634 ワード
主な内容:旧関数と比較して、元の画像の輪郭分析後の小さい領域をフィルタリングし、大きな領域を残します。
キーワード:connectedComponents WithStts
以前、よく使われていた方法は「先にcvを呼び出すこと」でした。関数(着信cv:RETR_CCOMPマーク)は、得られた接続エリアでcvを循環的に呼び出します。
例えば、GOCVHelperでこのように実現しました。
定義:
stats:そうですか
それぞれの輪郭のx,y,width,heightと面積に対応する。注意0のエリア表示はbackgroundです。
センターロイドは中心点に対応しています。
labelは、現在の画素がいくつかの輪郭であることを表すものに対応する。
例:
画像について
1、OpenCVにとって、白はデータがあり、黒はデータがないことを表しています。だから、画像入力の前に「黒底白図」に変換します。
2、labelsとstatsを見て、その中の第2の6つの面積は200より小さいです。
labelsの中で
完全に正しい上号、結果は
以上のように、OpenCVの新しい関数connectedComponents WithSttsの使い方は、小編集が皆さんに共有しているすべての内容です。参考にしていただきたいです。どうぞよろしくお願いします。
キーワード:connectedComponents WithStts
以前、よく使われていた方法は「先にcvを呼び出すこと」でした。関数(着信cv:RETR_CCOMPマーク)は、得られた接続エリアでcvを循環的に呼び出します。
例えば、GOCVHelperでこのように実現しました。
//
VP FindBigestContour(Mat src){
int imax = 0; //
int imaxcontour = -1; //
std::vector<std::vector<Point>>contours;
findContours(src,contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);
for (int i=0;i<contours.size();i++){
int itmp = contourArea(contours[i]);//
if (imaxcontour < itmp ){
imax = i;
imaxcontour = itmp;
}
}
return contours[imax];
}
//
vector<VP> connection2(Mat src,Mat& draw){
draw = Mat::zeros(src.rows,src.cols,CV_8UC3);
vector<VP>contours;
findContours(src.clone(),contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);
// ,
// ,
VP vptmp;
for(int i=1;i<contours.size();i++){
for(int j=contours.size()-1;j>=i;j--){
if (contourArea(contours[j]) < contourArea(contours[j-1]))
{
vptmp = contours[j-1];
contours[j-1] = contours[j];
contours[j] = vptmp;
}
}
}
OpenCV 3には新しい専門関数cvがあります。connectedComponents()と関数cv:connectedComponents WithStts()定義:
int cv::connectedComponents (
cv::InputArrayn image, // input 8-bit single-channel (binary)
cv::OutputArray labels, // output label map
int connectivity = 8, // 4- or 8-connected components
int ltype = CV_32S // Output label type (CV_32S or CV_16U)
);
int cv::connectedComponentsWithStats (
cv::InputArrayn image, // input 8-bit single-channel (binary)
cv::OutputArray labels, // output label map
cv::OutputArray stats, // Nx5 matrix (CV_32S) of statistics:
// [x0, y0, width0, height0, area0;
// ... ; x(N-1), y(N-1), width(N-1),
// height(N-1), area(N-1)]
cv::OutputArray centroids, // Nx2 CV_64F matrix of centroids:
// [ cx0, cy0; ... ; cx(N-1), cy(N-1)]
int connectivity = 8, // 4- or 8-connected components
int ltype = CV_32S // Output label type (CV_32S or CV_16U)
);
ここで、新たに出現したパラメータstats:そうですか
それぞれの輪郭のx,y,width,heightと面積に対応する。注意0のエリア表示はbackgroundです。
センターロイドは中心点に対応しています。
labelは、現在の画素がいくつかの輪郭であることを表すものに対応する。
例:
画像について
Mat img = cv::imread( "e:/sandbox/rect.png",0);
cv::Mat img_edge, labels, img_color, stats,centroids;
cv::threshold(img, img_edge, 128, 255, cv::THRESH_BINARY);
bitwise_not(img_edge,img_edge);
cv::imshow("Image after threshold", img_edge);
int i, nccomps = cv::connectedComponentsWithStats (
img_edge, labels,
stats, centroids
);
cout << "Total Connected Components Detected: " << nccomps << endl;
vector<cv::Vec3b> colors(nccomps+1);
colors[0] = Vec3b(0,0,0); // background pixels remain black.
for( i = 1; i < nccomps; i++ ) {
colors[i] = Vec3b(rand()%256, rand()%256, rand()%256);
if( stats.at<int>(i, cv::CC_STAT_AREA) < 200 )
colors[i] = Vec3b(0,0,0); // small regions are painted with black too.
}
img_color = Mat::zeros(img.size(), CV_8UC3);
for( int y = 0; y < img_color.rows; y++ )
for( int x = 0; x < img_color.cols; x++ )
{
int label = labels.at<int>(y, x);
CV_Assert(0 <= label && label <= nccomps);
img_color.at<cv::Vec3b>(y, x) = colors[label];
}
cv::imshow("Labeled map", img_color);
cv::waitKey();
注意:1、OpenCVにとって、白はデータがあり、黒はデータがないことを表しています。だから、画像入力の前に「黒底白図」に変換します。
2、labelsとstatsを見て、その中の第2の6つの面積は200より小さいです。
labelsの中で
完全に正しい上号、結果は
以上のように、OpenCVの新しい関数connectedComponents WithSttsの使い方は、小編集が皆さんに共有しているすべての内容です。参考にしていただきたいです。どうぞよろしくお願いします。