需要緊急幫助的線程:這裏的目標是separtemask將採取每個圖像和分開不同的輪廓和圖像中的每個輪廓它將調用handleobject線程。所以每個for循環都會調用handeobject線程。但是,對象索引變量需要在每個線程中傳遞。但是隻傳遞objectndex的最後一個值,這是由於speratemask函數循環並且取消了obj.objindx的值,並且只有傳遞給所有線程的obj.objindx的最後一個值是 。無論如何都要通過handleobject中的每個objectindex 值。如果我們取消註釋pthread_join(tid [objectIndex],NULL),代碼運行良好;但它不會給一個parralel程序pthread並行處理
void separateMask(IplImage *maskImg)
{
for(r = contours; r != NULL; r = r->h_next)
{
cvSet(objectMaskImg, cvScalarAll(0), NULL);
CvScalar externalColor = cvScalarAll(0xff);
CvScalar holeColor = cvScalarAll(0x00);
int maxLevel = -1;
int thinkness = CV_FILLED;
int lineType = 8; /* 8-connected */
cvDrawContours(objectMaskImg, r, externalColor, holeColor, maxLevel, thinkness,lineType, cvPoint(0,0));;
obj.objectMaskImg1[objectIndex]=(IplImage *) malloc(sizeof(IplImage));
obj.objectMaskImg1[objectIndex]=objectMaskImg;
obj.objindx=objectIndex;
obj.intensityOut1=intensityOut;
obj.tasOut1=tasOut;
pthread_create(&tid[objectIndex],NULL,handleObject,(void *)&obj);
//pthread_join(tid[objectIndex],NULL);
printf("objectindx %d\n",obj.objindx);
objectIndex++;
}
// cvReleaseImage(&objectMaskImg);
//cvReleaseMemStorage(&storage);
printf("Exitng Separatemask\n");
}
void* handleObject(void *arg)
{
int i, j;
handle *hndl;
hndl=(handle *) malloc(sizeof(handle));
hndl=(handle*)arg;
pthread_mutex_t lock=PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_lock(&lock);
IplImage *pImg;
float statistics_ratio[3][9];
pthread_t tid3;
tas3 tas2;
pImg = cvLoadImage("image.tif", CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH);
if(pImg == NULL)
{
fprintf(stderr, "Fail to load image %s\n", "tiff file");
return ;
}
tas2.pImg1=pImg;
printf("tst%d\n",hndl->objindx);
tas2.x=hndl->objindx;
tas2.objectMaskImg1=hndl->objectMaskImg1[tas2.x];
tas2.statistics_ratio[3][9]=statistics_ratio[3][9];
double mean = average_intensity(pImg, tas2.objectMaskImg1);
int total = total_white(pImg, tas2.objectMaskImg1);
pthread_mutex_unlock(&lock);
printf("Exiting handle object thread_id %d\n\n", pthread_self());
}
我有一個額外的問題。我附加的代碼只能識別未標記的輪廓,只對1和零標記的蒙版執行。我的輸入蒙版圖像實際上標記爲每個輪廓的1,2,3,4 ....例如,第一個輪廓標記爲1,第二個輪廓標記爲2,所有輪廓僅爲1。如何修改我的代碼,以便我可以根據標記的圖像分別分離每個輪廓。示例contour1是一個單獨的圖像,contour2是另一個單獨的圖像。 – user1373805 2012-07-16 21:38:19