Если вы используете iOS, вам нужно включить ios.h или просто написать свои собственные методы класса для обработки img proc из cvMat в UIImage и наоборот.
Пожалуйста, извините за комментарииони только для тех, у кого, возможно, есть те же самые «бредовые» исследования, что и у меня.Каждое изображение потребует совершенно разных настроек.Не сдавайся.Houghcircles - это лучший алгоритм обнаружения.Я собираюсь объединить некоторый игровой код с обнаружением, чтобы сделать его лучше, проще, быстрее.
#import "JmBViewController.h"
@interface JmBViewController ()
@end
@implementation JmBViewController
- (void)viewDidLoad {
[super viewDidLoad];
_imgtest = [UIImage imageNamed:@"IMG_0424.PNG"];
cv::Mat cvImage;
UIImageToMat(_imgtest, cvImage);
if (!cvImage.empty()) {
cv::Mat gray;
// cv::Mat filteredMat;
cv::cvtColor(cvImage, gray, CV_BGRA2GRAY);
// cv::GaussianBlur(gray, gray, cv::Size(5, 5), 1.2, 1.2);
cv::vector<cv::Vec3f> circles;
//cv::HoughCircles(gray, circles, CV_HOUGH_GRADIENT, 1, 50);
/*
for(size_t i = 0; i < circles.size(); i++)
{
cv::Point center((cvRound(circles[i][0]), cvRound(circles[i][1])));
int radius = cvRound(circles[i][2]);
cv::circle(gray, center, 3, cv::Scalar(0,255,0));
cv::circle(gray, center, radius, cv::Scalar(0,0,255));
}
*/
// for ( int i = 1; i < 15; i = i + 2 )
cv::GaussianBlur(gray, gray, cv::Size(9, 9), 1.5, 1.5);
cv::Mat edges;
cv::Canny(gray, edges, 0, 50);
//gray.setTo(cv::Scalar::all(0));
//gray.setTo(cv::Scalar::all(255), edges);
cv::HoughCircles(gray, circles, CV_HOUGH_GRADIENT, 1, gray.rows/30, 100, 50, 10, 30 );
for(size_t i = 0; i < circles.size(); i++)
{
cv::Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
int radius = cvRound(circles[i][2]);
cv::circle(cvImage, center, 5, cv::Scalar::all(200), -1, 8, 0 );//center
cv::circle(cvImage, center, radius, cv::Scalar::all(255), 3, 8, 0 );//diamter
NSLog(@"Circles: %ld", i+1);
// cv::imshow(&"circles i " [ i], gray);
}
_imgView.image = MatToUIImage(cvImage);
}
/*
cv::Mat cvImage;
cv::Mat grey;
cv::Mat filteredMat;
cv::vector<cv::Vec3f> circles;
// cv::cvtColor(_imgtest, cvImage, CV_BGR2GRAY);
cv::threshold(grey, filteredMat, 100, 255, CV_THRESH_BINARY);
[UIImageCVMatConverter cvMatGrayFromUIImage:_imgtest];
// cv::cvtColor(cvImage, grey, CV_RGBA2GRAY);
// UIImageToMat(_imgtest, cvImage);
cv::HoughCircles(cvImage, circles, CV_HOUGH_GRADIENT, 1, 50);
// MatToUIImage(cvImage);
_imgView.image = [UIImageCVMatConverter UIImageFromCVMat:cvImage];
_imgView.image = MatToUIImage(cvImage);
*/
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
UIImage* MatToUIImage(const cv::Mat& image) {
NSData *data = [NSData dataWithBytes:image.data length:image.elemSize()*image.total()];
CGColorSpaceRef colorSpace;
if (image.elemSize() == 1) {
colorSpace = CGColorSpaceCreateDeviceGray();
}else { colorSpace = CGColorSpaceCreateDeviceRGB();
}
CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
CGImageRef imageRef = CGImageCreate(image.cols, image.rows, 8, 8*image.elemSize(), image.step.p[0], colorSpace, kCGImageAlphaNone|kCGBitmapByteOrderDefault, provider, NULL, FALSE, kCGRenderingIntentDefault);
UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
return finalImage;
}
*/
@end