iOS 앱의 OpenCV 웹 사이트에서 this sample을 재현하려고합니다.터치 이벤트를 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
들으.