[英]Convert OpenCV-Python to C++/Objective C
我從@abid-rahman-k 中發現了這個非常好的代碼來檢測圖像中的矩形: OpenCV C++/Obj-C: Advanced square detection現在代碼在 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);
}
}
}
更新:
該程序運行,但在我選擇圖像后它崩潰了,我收到了這個錯誤:
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)
在這里,這是可行的:
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);
我認為錯誤是,您實際上得到了一個船體數組 ,而不僅僅是一個船體。
我在您的代碼中看不到未讀內容,因此,我假設您正在讀取此函數之外的圖像並將其傳遞給您。是否在讀取后立即嘗試執行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);
(你不說夏洛克!)
我試圖找到一個解決這些鏈接中的代碼的方法:
我希望這份志願會比他們對我的幫助更大。
另外,很抱歉將其發布為答案...但是我的聲譽很低,無法添加評論。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.