如何根据工作 Python 代码在 iPhone 应用程序的 opencvWrapper 文件中创建 OpenCV 函数 findcontour
Posted
技术标签:
【中文标题】如何根据工作 Python 代码在 iPhone 应用程序的 opencvWrapper 文件中创建 OpenCV 函数 findcontour【英文标题】:how to create the OpenCV function findcontour in my opencvWrapper file in iPhone application based on working Python code 【发布时间】:2018-08-11 08:42:36 【问题描述】:我已经在我的 iPhone 应用程序中集成了 OpenCV,并设法拍摄了一张照片,然后使用以下代码对其进行处理。现在我想实现 findcontour 函数以获取轮廓和层次结构,就像我在 Python 中所做的那样(下面的代码)。任何人都可以协助处理此代码吗?
// OpenCVWrapper.mm
@implementation OpenCVWrapper : NSObject
+(UIImage *)ConvertImage:(UIImage *)image
cv::Mat mat;
UIImageToMat(image, mat);
cv::Mat median;
cv::medianBlur(mat, median, 3);
cv::Mat gray;
cv::cvtColor(median, gray, CV_RGB2GRAY); //or use COLOR_BGR2GRAY
cv::Mat denoise;
cv::fastNlMeansDenoising(gray, denoise, 30.0, 7, 21);
//here I want to enter the converted Python code from below in order to get the largest contour of the image
//cv::findContours(denoise, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
UIImage *binImg = MatToUIImage(contour);
return binImg;
@end
Python代码是:
image, contours, hierarchy = cv2.findContours(denoise,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
contours = [(c, cv2.contourArea(c)) for c in contours]
# sort contours list by area, biggest first
contours = sorted(contours, key=lambda c: c[1], reverse=True)
cnt = contours[0]
img = cv2.drawContours(frame, cnt, 0, (0,255,0), 2)
我实际上不确定是否可以处理 UIImage,然后仅返回轮廓(透明背景),以便可以将其叠加到视频流中。这是 ViewController 中使用 captureOutput 的代码:
func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!,
from connection: AVCaptureConnection!)
guard let uiImage = imageFromSampleBuffer(sampleBuffer: sampleBuffer) else return
DispatchQueue.main.async(execute:
self.imageView.image = OpenCVWrapper.convert(uiImage) ///I am really not sure whether this is the right code to show the uiImage on top of the live stream. Have not really gotten to that issue as yet, but any assistance is welcome
【问题讨论】:
这既不是 Python 也不是 Swift。但是C++。另外,您是否在寻找 C++ 轮廓示例? 第二个是Python,我要转成C++,第三个是Swift。你知道 C++ 中任何合适的轮廓链接吗? 我的意思是,您要寻找为您提供 C++ 的人。所以标记你不需要的两种语言,但不是你需要的,对我来说似乎很奇怪。而且 OpenCV 官方文档中充满了教程代码,包括与轮廓相关的代码。 另外,显然在这里搜索 c++ OpenCV 轮廓会产生很多示例。 是的,你让我明白了,我对 C++ 一无所知,我不想仅仅因为这几行而陷入其中。但我听从了你的建议,发现这些链接非常有帮助,将帮助我自己完成未来。 opencvexamples.blogspot.com/2013/09/find-contour.html 和 ***.com/questions/8449378/finding-contours-in-opencv 【参考方案1】:实际上,我想通了。这是可行的解决方案:
//Find the contours. Use the contourOutput Mat so the original image doesn't get overwritten
std::vector<std::vector<cv::Point> > contours;
cv::Mat contourOutput = canny.clone();
cv::findContours( contourOutput, contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE );
int largest_area=0;
int largest_contour_index=0;
// iterate through each contour.
for( int i = 0; i< contours.size(); i++ )
// Find the area of contour
double a=contourArea( contours[i],false);
if(a>largest_area)
largest_area=a;std::cout<<i<<" area "<<a<<std::endl;
// Store the index of largest contour
largest_contour_index=i;
cv::Mat contourImage(canny.size(), CV_8UC3, cv::Scalar(0,0,0));
cv::Scalar color;
color = cv::Scalar(255, 0, 0);
cv::drawContours(contourImage, contours, largest_contour_index, color);
【讨论】:
以上是关于如何根据工作 Python 代码在 iPhone 应用程序的 opencvWrapper 文件中创建 OpenCV 函数 findcontour的主要内容,如果未能解决你的问题,请参考以下文章
在 iPhone OS 应用程序中使用 Ruby/Python 代码?