我想从带有一些噪点的灰度图像中获取矩形对象的角坐标。
我从这张图片https://imgur.com/BNoCn1u开始。中心区域具有灰色强度不同的方格矩形。我想要的是绿色https://imgur.com/97efZlb中矩形的坐标。
使用以下代码:
im = cv2.imread("opencv_frame_0.tif",0)
data = np.array(im)
edg = cv2.Canny(data, 120, 255)
ret,thresh = cv2.threshold(data,140,255,1)
imshow(thresh,interpolation='none', cmap=cm.gray)
我能够得到https://imgur.com/1xurVTB。看起来不错,但是我不知道如何有效地获取拐角坐标的中心白框。稍后我将有其他类似的图像,其中中心的灰色矩形可以具有不同的大小,因此我希望对代码进行优化以适合将来。
我尝试了OpenCV - How to find rectangle contour of a rectangle with round corner?和OpenCV/Python: cv2.minAreaRect won't return a rotated rectangle中的其他示例。最后一个给我https://imgur.com/E4Gl8Z6最佳设置。
感谢您的帮助!谢谢。
答案 0 :(得分:1)
如果您正在寻找实现更多功能的python代码,可以在此仓库中找到它。
https://github.com/DevashishPrasad/Angle-Distance
因此,要解决您的问题,此代码可能会有所帮助-
>>> play
No Yes
0 2 0
1 3 1
2 5 4
评论全部解释
答案 1 :(得分:0)
从预处理中,我得到以下输出: 从这里您可以轻松找到自己喜欢的4个角(使用HarrisCorners等功能,对图像进行矢量化并采用几何方法,您自己的角检测算法等)。这真的取决于您自己的需求。
这是我的代码,我要做的是: 1.模糊 2.门槛 3.查找连接的组件 4.找到最大的并分离 5.找到轮廓
请根据需要进行修改,仅作为参考(以防万一,OpenCV在C ++和Python中是相同的,并且您提供的示例表明您知道自己在做什么) :
#include <opencv2/opencv.hpp>
#include <algorithm>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
Mat img2, img = imread("pic.png");
cvtColor(img, img, cv::COLOR_BGR2GRAY);
blur(img, img, Size(7, 7));
threshold(img, img2, 0, 255, THRESH_OTSU | THRESH_BINARY_INV);
Mat labels, stats, centroids;
int n = cv::connectedComponentsWithStats(img2, labels, stats, centroids, 8, CV_16U);
ushort area, x0, y0, labelBig = 0, maxArea = 0;
for (int i = 1 ; i < n ; i++) {
area = stats.at<int>(i, cv::CC_STAT_AREA);
if (area > maxArea) {
maxArea = area;
labelBig = i;
}
}
Mat img3 = Mat(img2.rows, img2.cols, CV_8U, Scalar(0));
std::mutex mtx;
labels.forEach<ushort>([&img3, labelBig, &mtx](ushort &label, const int pos[]) -> void {
if (label == labelBig) {
lock_guard<mutex> guard(mtx);
img3.at<uchar>(pos) = 255;
}
});
Mat img4;
Canny(img3, img4, 50, 100, 3);
imshow("Frame", img4);
waitKey();
return 0;
}
请注意,我正在使用Otsu阈值处理,这使其具有一定的鲁棒性。还请注意,我也在反转您的图像;之后,最大和最白的区域就是我认为的矩形。