2013-07-10 53 views
0

我使用的是旧版C语言,因为我使用的书已经过时:(目前,我正在开发一个项目来检测图像中的对象,首先我对灰度图像进行高斯平滑处理,然后腐蚀它,然后我应用阈值,现在我试图获得每个宽度有多少黑色像素,以便我可以将它与其他行进行比较以确定中心。不过,我不断收到错误:黑色像素计数

term does not evaluate to a function taking 1 arguments

#include <highgui.h> 
#include <cv.h> 
#include <cxcore.h> 

int main() 
{ 
    int total, 
     zero, 
     width, 
     blackpixel; 

    IplImage* in = cvLoadImage("Wallet.jpg", CV_LOAD_IMAGE_GRAYSCALE); 
    IplImage* gsmooth = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1); 
    IplImage* erode = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1); 
    IplImage* Iat = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1); 
    IplImage* bpixel = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1); 

    cvSmooth(in, gsmooth, CV_GAUSSIAN, 3, 0, 0, 0); 
    cvErode(gsmooth, erode, NULL, 2); 
    cvThreshold(erode, Iat, 100, 255, CV_THRESH_BINARY); 

    total = (Iat->height)*(Iat->width); 

    zero = total - cvCountNonZero(Iat); 

    printf("Total pixels: %d\nWhite pixels: %d\nBlack pixels: %d\n", total, cvCountNonZero(Iat), zero); 

    for(int i = 0; i < Iat->width; i++) 
    { 
     blackpixel = Iat->width(i); 
    } 

    cvNamedWindow("Original", 1); 
    cvNamedWindow("Gaussian Smoothing", 1); 
    cvNamedWindow("Erode", 1); 
    cvNamedWindow("Adaptive Threshold", 1); 

    cvShowImage("Original", in); 
    cvShowImage("Gaussian Smoothing", gsmooth); 
    cvShowImage("Erode", erode); 
    cvShowImage("Adaptive Threshold", Iat); 

    cvWaitKey(0); 

    cvReleaseImage(&in); 
    cvReleaseImage(&gsmooth); 
    cvReleaseImage(&erode); 
    cvReleaseImage(&Iat); 

    cvDestroyWindow("Original"); 
    cvDestroyWindow("Gaussian Smoothing"); 
    cvDestroyWindow("Erode"); 
    cvDestroyWindow("Adaptive Threshold"); 
} 
+0

那么简单? – Totoro

+0

对不起。我应该增加更多细节 – user2521723

回答

0

在该行的问题

blackpixel = Iat->width(i); 

是错误的语法。

Iat-> width会给你图像的宽度,一个整数属性。

我不事环路

for(int i = 0; i < Iat->height; i++) 
    { 
     blackpixel = Iat->width(i); 
    } 

可以计算出在给定行的黑色像素的数量。你可能需要像

for(int i = 0; i < Iat->height; i++) // // every row 
{ 
    for(int j = 0; j < Iat->width; j++) // pixels in each row 
    { 
     // get count pixels here 
    } 
    // do things with the count for the current row 
} 

如果你使用的是cvMat数据结构而不是IplImage,这应该会更快。

1

首先,在使用像“Learining OpenCV”这样过时的书时,不要害怕使用C++ API,因为这些概念仍然相关。如果您理解了这个想法,那么翻译成C++ API并不难,因为您不能复制粘贴代码。我以这种方式学习OpenCV,我认为它工作:)。

用C++ API,将可以更详细一点添加到代码,如IAT的定义和初始化为

cv::Mat zeros = cv::Mat::zeros(Iat.size()); 
cv::Mat blackPixels = (Iat == zeros); 
int blackPixelsCount = blackPixels.total();