Your surface is (84-11+1)*(84-11+1)=5476. When I use threshold and connectedComposantWith stats it gives me good result.
Becarefull your link is jpg image so you have got some pixels which are not white or black.
Results are
***********connectedComponentsWithStats
Area :4524
Area :5476
***********With contour
Perimeter : 292
Area : 5329
With this program :
int main(int argc, char **argv)
{
Mat statComposante; /*< http://docs.opencv.org/trunk/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html */
Mat centreGComposante;
Mat mTest,mThresh,mConnected;
mTest=imread("143866016312554.jpg", CV_LOAD_IMAGE_GRAYSCALE);
threshold( mTest, mThresh, 128,255,cv::THRESH_BINARY_INV);
cout << "***********************************connectedComponentsWithStats\n";
connectedComponentsWithStats(mThresh, mConnected,statComposante,centreGComposante, 4, CV_32S);
for (int i = 0; i < statComposante.rows; i++)
{
cout <<"Area :"<<statComposante.at<int>(i,cv::CC_STAT_AREA)<<"\n";
}
// with contours
cout << "***********************************With contour\n";
Mat mClone = mThresh.clone();
vector<vector<cv::Point> > contours;
findContours( mClone, contours,cv::RETR_EXTERNAL,cv::CHAIN_APPROX_NONE);
vector<Moments> mu(contours.size() );
for( int i = 0; i < contours.size(); i++ )
{
cout <<"Perimeter : "<< arcLength( contours[i], true ) << "\n";
cout <<"Area : "<< contourArea( contours[i], false ) << "\n";
}
return 0;
}
your image is with a random palette