line = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5), (-1, -1))
时间: 2023-11-04 19:05:02 浏览: 126
这段代码使用 OpenCV 库中的 `getStructuringElement` 函数创建了一个形态学结构元素,用于形态学操作,如膨胀或腐蚀。其中,第一个参数 `cv2.MORPH_RECT` 表示创建一个矩形结构元素,第二个参数 `(5,5)` 指定了结构元素的大小为 $5 \times 5$,第三个参数 `(-1,-1)` 表示结构元素的锚点位于结构元素中心。
相关问题
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { int startf = 39, endf = 512; // 视频帧的起始和结束帧号 // 读入背景图像 Mat Ibj = imread("D://yanyi//opencv//test//opencv1//BackgroundFrame.jpg", IMREAD_GRAYSCALE); for (int i = startf; i <= endf; i++) // 遍历视频帧 { // 读入当前视频帧并转化为灰度图像 Mat I1 = imread("frame" + to_string(i) + ".jpg"); Mat gray; cvtColor(I1, gray, COLOR_BGR2GRAY); // 将灰度图像转换为双精度浮点型并减去背景图像 gray.convertTo(gray, CV_64F); gray -= Ibj; // 对图像进行二值化处理 Mat bw1; threshold(gray, bw1, 25, 255, THRESH_BINARY); // 对二值化图像进行形态学开运算 Mat bwAreaOpenBW; morphologyEx(bw1, bwAreaOpenBW, MORPH_OPEN, getStructuringElement(MORPH_RECT, Size(3, 3))); // 对二值化图像进行连通组件分析 Mat labels; if (bwAreaOpenBW.depth() != CV_8U && bwAreaOpenBW.depth() != CV_8S) { bwAreaOpenBW.convertTo(bwAreaOpenBW, CV_8U); // or CV_8S } int n = connectedComponents(bwAreaOpenBW, labels, 8, CV_16U); // 遍历每一个连通组件 for (int j = 1; j < n; j++) { // 提取连通组件中的像素点 Mat mask = labels == j; vector<Point> points; findNonZero(mask, points); // 构建矩阵并求解线性方程组 Mat X(points.size(), 2, CV_64F); for (int k = 0; k < points.size(); k++) { X.at<double>(k, 0) = points[k].x; X.at<double>(k, 1) = points[k].y; } Mat Y(points.size(), 1, CV_64F); for (int k = 0; k < points.size(); k++) { Y.at<double>(k, 0) = points[k].y; } Mat coef; solve(X, Y, coef, DECOMP_SVD); // 计算轴的两个端点的坐标 double b1 = coef.at<double>(0, 0); double b2 = coef.at<double>(1, 0); double minzhi = points[0].x; double maxzhi = points[0].x; for (int k = 1; k < points.size(); k++) { if (points[k].x < minzhi) { minzhi = points[k].x; } if (points[k].x > maxzhi) { maxzhi = points[k].x; } } double duan1x = b1 + b2 * minzhi; double duan1y = minzhi; double duan2x = b1 + b2 * maxzhi; double duan2y = maxzhi; // 在图像上绘制轴的两个端点 circle(I1, Point(duan1x, duan1y), 3, Scalar(0, 0, 255), -1); circle(I1, Point(duan2x, duan2y), 3, Scalar(0, 0, 255), -1); } // 显示处理结果并等待用户按键 imshow("result", I1); waitKey(1); } return 0; }没有绘制出端点是怎么回事
在您的代码中,绘制了轴的两个端点,但是没有将它们绘制在原始图像上,而是绘制在处理结果I1上。因此,当最后显示处理结果时,只显示了处理结果I1,而没有显示原始图像。
要绘制端点并显示在原始图像上,可以将绘制端点的代码移动到以下位置:
```
// 在图像上绘制轴的两个端点
circle(I1, Point(duan1x, duan1y), 3, Scalar(0, 0, 255), -1);
circle(I1, Point(duan2x, duan2y), 3, Scalar(0, 0, 255), -1);
// 显示处理结果并等待用户按键
imshow("result", I1);
waitKey(1);
```
在这个位置上,绘制了端点后,将它们显示到了原始图像I1中,而不是处理结果I1。
请注意,此代码只绘制了端点,并没有将它们连接成一条直线。如果您希望画出直线,请尝试使用cv::line函数。
多目标轴2端点定位 startf=353;endf=1500; for i=startf:1:endf I1 =read(xyloObj,i);%读取每一帧 % figure,imshow(I1); I1=im2double(rgb2gray(I1))-Ibj;%减去背景帧 bw1=im2bw(I1,25/255);%二值化处理,灰度值大于25设置为白色,小于等于25设置为黑色 bwAreaOpenBW =bwareaopen(bw1,10);%将二值图像bw1中的小区域(面积小于等于10个像素)去除,得到一个新的二值图像bwAreaOpenBW。这个操作可以消除二值图像中一些不必要的小区域,保留需要的大区域 [L,n]=bwlabel(bwAreaOpenBW,8); for j=1:1:n [r, c] = find(L==j); rc = [r c]; u=size(r); zhou2=fitlm(rc(:,2),rc(:,1)); %拟合直线 b1(i,j)=zhou2.Coefficients.Estimate(1,1); b2(i,j)=zhou2.Coefficients.Estimate(2,1); minzhi(i,j)=min(rc(:,2)); maxzhi(i,j)=max(rc(:,2)); % y = minzhi(i,j):1:maxzhi(i,j); % x = b1(i,j)+b2(i,j).*y; % plot(y,x);hold on; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2个端点 duan1x(i,j)=b1(i,j)+b2(i,j).*minzhi(i,j); duan1y(i,j)=minzhi(i,j); duan2x(i,j)=b1(i,j)+b2(i,j).*maxzhi(i,j); duan2y(i,j)=maxzhi(i,j); % plot(minzhi,b1+b2.*minzhi,'r*');hold on; % plot(maxzhi,b1+b2.*maxzhi,'r*');hold on; end end转换为vs代码,用opencv库
下面是将上述MATLAB代码转换为OpenCV代码的示例:
```cpp
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
int startf = 353, endf = 1500;
for (int i = startf; i <= endf; i++)
{
Mat I1 = imread("frame" + std::to_string(i) + ".jpg");
Mat Ibj = imread("background.jpg"); // 背景帧
Mat gray;
cvtColor(I1, gray, COLOR_BGR2GRAY);
gray.convertTo(gray, CV_64F);
gray -= Ibj;
Mat bw1;
threshold(gray, bw1, 25, 255, THRESH_BINARY);
Mat bwAreaOpenBW;
morphologyEx(bw1, bwAreaOpenBW, MORPH_OPEN, getStructuringElement(MORPH_RECT, Size(3, 3)));
Mat labels, stats, centroids;
int n = connectedComponentsWithStats(bwAreaOpenBW, labels, stats, centroids);
for (int j = 1; j < n; j++)
{
Mat mask = labels == j;
Mat r, c;
findNonZero(mask, r);
reduce(r, r, 1, REDUCE_AVG);
findNonZero(mask, c);
reduce(c, c, 1, REDUCE_AVG);
Mat coeffs = Mat::zeros(2, 1, CV_64F);
fitLine(r, c, coeffs, DIST_L2, 0.01, 0.01);
double b1 = coeffs.at<double>(0, 0);
double b2 = coeffs.at<double>(1, 0);
int minzhi = *std::min_element(c.begin<int>(), c.end<int>());
int maxzhi = *std::max_element(c.begin<int>(), c.end<int>());
double duan1x = b1 + b2 * minzhi;
double duan1y = minzhi;
double duan2x = b1 + b2 * maxzhi;
double duan2y = maxzhi;
// 在图像上绘制直线和端点
line(I1, Point(b1 + b2 * minzhi, minzhi), Point(b1 + b2 * maxzhi, maxzhi), Scalar(0, 0, 255), 2);
circle(I1, Point(duan1x, duan1y), 3, Scalar(0, 255, 0), -1);
circle(I1, Point(duan2x, duan2y), 3, Scalar(0, 255, 0), -1);
}
imshow("I1", I1);
waitKey(0);
}
return 0;
}
```
需要注意的是,这里使用了OpenCV的函数来读取图像、处理图像和绘制结果。由于MATLAB和OpenCV的函数参数和输出格式有所不同,因此需要对代码进行适当修改。
阅读全文