2013-07-10 9 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

Вы можете добавить немного больше деталей к коду, например, определение и инициализация IAT? – 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

Прежде всего, не бойтесь использовать C++ API при использовании устаревшей книги типа «Обучение OpenCV», поскольку концепции по-прежнему актуальны. Перевод на C++ API не сложно, если вы понимаете идею и отлично выполняете это упражнение, потому что вы не можете просто скопировать код. Я изучил OpenCV таким образом, и я думаю, что это сработало :).

С API C++ это было бы так просто, как

cv::Mat zeros = cv::Mat::zeros(Iat.size()); 
cv::Mat blackPixels = (Iat == zeros); 
int blackPixelsCount = blackPixels.total(); 
Смежные вопросы