1
我試圖在OpenCV網站上覆制this sample在iOS應用上。在iOS上使用觸摸事件作爲OpenCV分水線算法的標記
問題是setMouseCallback
從High-level GUI
在邏輯上不適用於像iOS這樣的移動平臺。
所以我所做的是讓用戶可以在圖像上方繪製圖像,然後將圖形和圖像傳遞給我的OpenCV處理函數。
經過各種嘗試,似乎我的繪圖不被認爲是一個標記掩碼,所以我可能在某個地方犯了一個錯誤,而我真的不知道使用繪圖參數。
我的代碼:
- (UIImage *)watershedMAN:(UIImage *)imageRaw markers:(UIImage *)drawing {
Mat img, imgGray, markerMask, maskerMaskDrawn;
UIImageToMat(imageRaw, img);
UIImageToMat(drawing, maskerMaskDrawn);
cvtColor(img, markerMask, COLOR_BGR2GRAY);
cvtColor(markerMask, imgGray, COLOR_GRAY2BGR);
markerMask = Scalar::all(0);
//
// How to use 'maskerMaskDrawn' here?
//
int i, j, compCount = 0;
vector<vector<cv::Point> > contours;
vector<Vec4i> hierarchy;
findContours(markerMask, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);
Mat markers(markerMask.size(), CV_32S);
markers = Scalar::all(0);
int idx = 0;
for(; idx >= 0; idx = hierarchy[idx][0], compCount++)
{
drawContours(markers, contours, idx, Scalar::all(compCount+1), -1, 8, hierarchy, INT_MAX);
}
vector<Vec3b> colorTab;
for(i = 0; i < compCount; i++)
{
int b = theRNG().uniform(0, 255);
int g = theRNG().uniform(0, 255);
int r = theRNG().uniform(0, 255);
colorTab.push_back(Vec3b((uchar)b, (uchar)g, (uchar)r));
}
watershed(img, markers);
Mat wshed(markers.size(), CV_8UC3);
for(i = 0; i < markers.rows; i++)
for(j = 0; j < markers.cols; j++)
{
int index = markers.at<int>(i,j);
if(index == -1)
wshed.at<Vec3b>(i,j) = Vec3b(255,255,255);
else if(index <= 0 || index > compCount)
wshed.at<Vec3b>(i,j) = Vec3b(0,0,0);
else
wshed.at<Vec3b>(i,j) = colorTab[index - 1];
}
wshed = wshed*0.5 + imgGray*0.5;
return MatToUIImage(wshed);
}
imageRaw and drawing arguments
THX。