日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenCV的图像处理——iOS与OpenCV之间图像转换

發布時間:2025/3/21 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV的图像处理——iOS与OpenCV之间图像转换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

1.OpenCV有專門的iOS平臺的包,可以真接下載導入工程,也可以用cmake把OpenCV源碼編成.a文件,以靜態庫的形式導入工程。
2.我這里用的Xcode11,OpenCV用的是最4.20這個版本。

圖像轉換

1.iOS所支持的圖像格式是UIImage,OpenCV的圖像格式是Mat,如果要在iOS用OpenCV處理圖像,那得先把UIImage轉成Mat,才能使用OpenCV的庫來做相關的操作。這里要寫一個轉換函數把數據格式轉換過來就可以了,OC是可以調用C++函數的,這里直接用C++寫就可以了。
UIImage轉Mat:

void UIImageToMat(UIImage *ui_image, cv::Mat &cv_dst) {assert(ui_image.size.width > 0 && ui_image.size.height > 0);assert(ui_image.CGImage != nil || ui_image.CIImage != nil);//開緩沖區NSInteger width = ui_image.size.width;NSInteger height = ui_image.size.height;cv::Mat cv_mat8uc4 = cv::Mat((int)height, (int)width, CV_8UC4);CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();if (ui_image.CGImage){CGContextRef contextRef = CGBitmapContextCreate(cv_mat8uc4.data, cv_mat8uc4.cols, cv_mat8uc4.rows, 8, cv_mat8uc4.step, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrderDefault);CGContextDrawImage(contextRef, CGRectMake(0, 0, width, height), ui_image.CGImage);CGContextRelease(contextRef);}else{static CIContext* context = nil;if (!context){context = [CIContext contextWithOptions:@{ kCIContextUseSoftwareRenderer: @NO }];}CGRect bounds = CGRectMake(0, 0, width, height);[context render:ui_image.CIImage toBitmap:cv_mat8uc4.data rowBytes:cv_mat8uc4.step bounds:bounds format:kCIFormatRGBA8 colorSpace:colorSpace];}CGColorSpaceRelease(colorSpace);cv::Mat cv_mat8uc3 = cv::Mat((int)width, (int)height, CV_8UC3);cv::cvtColor(cv_mat8uc4, cv_mat8uc3, cv::COLOR_RGBA2BGR);cv_dst = cv_mat8uc3; }

2.OpenCV處理過的圖像是Mat的,如果要在iOS的UIImageView顯示出來,還是要把Mat轉成UIImage.
Mat轉UIImage:

UIImage *MatToUIImage(cv::Mat &cv_src) {assert(cv_src.elemSize() == 1 || cv_src.elemSize() == 3);cv::Mat cv_rgb;if (cv_src.elemSize() == 1){cv::cvtColor(cv_src, cv_rgb, cv::COLOR_GRAY2RGB);} else if (cv_src.elemSize() == 3){cv::cvtColor(cv_src, cv_rgb, cv::COLOR_BGR2RGB);}NSData *data = [NSData dataWithBytes:cv_rgb.data length:(cv_rgb.elemSize() * cv_rgb.total())];CGColorSpaceRef colorSpace;if (cv_rgb.elemSize() == 1){colorSpace = CGColorSpaceCreateDeviceGray();} else{colorSpace = CGColorSpaceCreateDeviceRGB();}CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);CGImageRef imageRef = CGImageCreate(cv_rgb.cols, cv_rgb.rows, 8, 8 * cv_rgb.elemSize(), cv_rgb.step.p[0], colorSpace, kCGImageAlphaNone|kCGBitmapByteOrderDefault, provider, NULL, false, kCGRenderingIntentDefault);UIImage *ui_image = [UIImage imageWithCGImage:imageRef];CGImageRelease(imageRef);CGDataProviderRelease(provider);CGColorSpaceRelease(colorSpace);return ui_image; }

總結

以上是生活随笔為你收集整理的OpenCV的图像处理——iOS与OpenCV之间图像转换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。