python代码:
import cv2 as cv
import numpy as np
def canny_demo(image):
t = 80
canny_output = cv.Canny(image, t, t * 2)
cv.imshow("canny_output", canny_output)
cv.imwrite("./canny_output.png", canny_output)
return canny_output
src = cv.imread("./test.png")
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
cv.imshow("input", src)
binary = canny_demo(src)
k = np.ones((3, 3), dtype=np.uint8)
binary = cv.morphologyEx(binary, cv.MORPH_DILATE, k)
# 轮廓发现
out, contours, hierarchy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
for c in range(len(contours)):
# x, y, w, h = cv.boundingRect(contours[c]);
# cv.drawContours(src, contours, c, (0, 0, 255), 2, 8)
# cv.rectangle(src, (x, y), (x+w, y+h), (0, 0, 255), 1, 8, 0);
rect = cv.minAreaRect(contours[c])
cx, cy = rect[0]
box = cv.boxPoints(rect)
box = np.int0(box)
cv.drawContours(src,[box],0,(0,0,255),2)
cv.circle(src, (np.int32(cx), np.int32(cy)), 2, (255, 0, 0), 2, 8, 0)
# 显示
cv.imshow("contours_analysis", src)
cv.imwrite("./contours_analysis.png", src)
cv.waitKey(0)
cv.destroyAllWindows()
C++代码:
#include
#include
using namespace cv;
using namespace std;
int main(int argc, const char *argv[])
{
Mat src = imread("./test.png");
if (src.empty()) {
printf("could not load image...\n");
return -1;
}
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src);
// ȥ�������ֵ��
Mat dst, gray, binary;
Canny(src, binary, 80, 160, 3, false);
imshow("binary", binary);
imwrite("./binary.png", binary);
Mat k = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
dilate(binary, binary, k);
// �������������
vector> contours;
vector hierarchy;
findContours(binary, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point());
for (size_t t = 0; t < contours.size(); t++) {
// ����������
Rect rect = boundingRect(contours[t]);
rectangle(src, rect, Scalar(0, 0, 255), 1, 8, 0);
// ���������
RotatedRect rrt = minAreaRect(contours[t]);
Point2f pts[4];
rrt.points(pts);
// ������ת����������λ��
for (int i = 0; i < 4; i++) {
line(src, pts[i % 4], pts[(i + 1) % 4], Scalar(0, 255, 0), 2, 8, 0);
}
Point2f cpt = rrt.center;
circle(src, cpt, 2, Scalar(255, 0, 0), 2, 8, 0);
}
imshow("contours", src);
waitKey(0);
return 0;
}
OpenCV学习笔记代码,欢迎follow:MachineLP/OpenCV-github.com