将OpenCV-Python转换为C ++ / Objective C

我从@ abid-rahman-k中发现了非常好的代码来检测图像中的一个矩形: OpenCV C ++ / Obj-C:高级平方检测现在代码是在Python中,这里是:

import cv2 import numpy as np img = cv2.imread('sof.jpg') img = cv2.resize(img,(500,500)) gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) ret,thresh = cv2.threshold(gray,127,255,0) contours,hier = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE) for cnt in contours: if cv2.contourArea(cnt)>5000: # remove small areas like noise etc hull = cv2.convexHull(cnt) # find the convex hull of contour hull = cv2.approxPolyDP(hull,0.1*cv2.arcLength(hull,True),True) if len(hull)==4: cv2.drawContours(img,[hull],0,(0,255,0),2) cv2.imshow('img',img) cv2.waitKey(0) cv2.destroyAllWindows() 

我想把它转换成Objective C / C ++。 这是我做的,但没有工作,我错过了什么?

 - (void)processImage2:(cv::Mat&)image; { cv::Mat img,gray,thresh; std::vector<std::vector<cv::Point> > contours; // cv::resize(image.clone(), image, cv::Size(500,500) ); cvtColor(image, gray, cv::COLOR_BGR2GRAY ); cv::threshold(gray, thresh, 127, 255, 0); findContours(thresh, contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE); std::vector<cv::Point> hull; for (size_t i = 0; i < contours.size(); i++) { if (cv::contourArea(contours[i])>5000){ cv::convexHull(contours[i],hull); approxPolyDP(hull, hull, 0.1*arcLength(hull, true), true); if (hull.size() ==4) cv::drawContours(image,hull,0,cv::Scalar(0,255,0),2); } } } 

更新:

该程序运行,但在我select图像崩溃后,我得到这个错误:

 Nov 28 10:26:52 Anas-Basalamahs-MacBook-Air.local OpenCV Tutorial[18861] <Error>: CGBitmapContextCreate: unsupported parameter combination: 0 integer bits/component; 0 bits/pixel; 0-component color space; kCGImageAlphaNone; 0 bytes/row. Nov 28 10:26:52 Anas-Basalamahs-MacBook-Air.local OpenCV Tutorial[18861] <Error>: CGContextConcatCTM: invalid context 0x0 Nov 28 10:26:52 Anas-Basalamahs-MacBook-Air.local OpenCV Tutorial[18861] <Error>: CGContextSetInterpolationQuality: invalid context 0x0 Nov 28 10:26:52 Anas-Basalamahs-MacBook-Air.local OpenCV Tutorial[18861] <Error>: CGContextDrawImage: invalid context 0x0 Nov 28 10:26:52 Anas-Basalamahs-MacBook-Air.local OpenCV Tutorial[18861] <Error>: CGBitmapContextCreateImage: invalid context 0x0 2012-11-28 10:26:52.963 OpenCV Tutorial[18861:c07] resized image size: NSSize: {0, 0} OpenCV Error: Assertion failed (i < 0) in getMat, file /Users/bloodaxe/Develop/opencv/modules/core/src/matrix.cpp, line 957 terminate called throwing an exception(lldb) 

在代码中没有看到一个imread,所以我假设你正在读取这个函数以外的图像并将其传入。你是否尝试过在读取后立即进行imshow,以确保图像正确加载。

第一行表明这可能是问题所在。

问题是在cv::drawContours(image,hull,0,cv::Scalar(0,255,0),2);

出于某种原因,它不喜欢hull数组…因此,我想这些行中有一个错误发生:

 cv::convexHull(contours[i],hull); approxPolyDP(hull, hull, 0.1*arcLength(hull, true), true); 

(你不要说Sherlock!)

我试图find一个解决scheme玩这些链接的代码:

我希望这个愿望能帮助你,而不是他们对我的帮助。

此外,抱歉张贴作为答案…但我的声誉低,我不能添加评论。

在这里,这是工作:

 cv::Mat oResult, oToShow; // roMat is your input image cv::cvtColor(roMat, oToShow, CV_GRAY2BGR); cv::threshold(roMat, oResult, 127, 255, 0); std::vector<std::vector<cv::Point>> contours; std::vector<cv::Vec4i> hierarchy; cv::findContours( oResult, contours, hierarchy, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE ); std::vector<std::vector<cv::Point> > oHull(contours.size()); for( int i = 0; i != contours.size(); i++) { if( cv::contourArea(contours[i]) > 5000 ) { cv::convexHull(contours[i], oHull[i]); cv::approxPolyDP(oHull[i], oHull[i], 0.1*cv::arcLength(oHull[i], true), true); if( oHull[i].size() == 4 ) { cv::drawContours(oToShow, oHull, -1, cv::Scalar(0, 255,0), 2, 8); } } } cv::imshow("hull", oToShow); cv::waitKey(0); 

我认为这个错误是,你实际上得到了一堆船体,而不是一个船体。