CV_CAST_8U(val);的意义

图像处理宏定义解析

图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601

要明白这句话,关键是要找到这句话的定义!

怎么找?方法见我的另一篇博文,链接如下:

https://blog.youkuaiyun.com/wenhao_ir/article/details/51217639

这里我把找到的宏写义写下来!

/* general-purpose saturation macros */
#define  CV_CAST_8U(t)  (uchar)(!((t) & ~255) ? (t) : (t) > 0 ? 255 : 0)
#define  CV_CAST_8S(t)  (schar)(!(((t)+128) & ~255) ? (t) : (t) > 0 ? 127 : -128)
#define  CV_CAST_16U(t) (ushort)(!((t) & ~65535) ? (t) : (t) > 0 ? 65535 : 0)
#define  CV_CAST_16S(t) (short)(!(((t)+32768) & ~65535) ? (t) : (t) > 0 ? 32767 : -32768)
#define  CV_CAST_32S(t) (int)(t)
#define  CV_CAST_64S(t) (int64)(t)
#define  CV_CAST_32F(t) (float)(t)
#define  CV_CAST_64F(t) (double)(t)

从宏定义来看可见 CV_CAST_8U(val);就是把val强制转化为uchar类型,如果val>=255 则val=255 如果val<=0 则val=0;

图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601

``` void drawAxis(Mat& img, Point p, Point q, Scalar colour, const float scale = 0.2) { double angle = atan2((double)p.y - q.y, (double)p.x - q.x); // 角度(弧度) double hypotenuse = sqrt((double)(p.y - q.y) * (p.y - q.y) + (p.x - q.x) * (p.x - q.x)); // 将箭头长度放大scale倍 q.x = (int)(p.x - scale * hypotenuse * cos(angle)); q.y = (int)(p.y - scale * hypotenuse * sin(angle)); line(img, p, q, colour, 1, CV_AA); // 创建箭头箭头钩 p.x = (int)(q.x + 9 * cos(angle + CV_PI / 4)); p.y = (int)(q.y + 9 * sin(angle + CV_PI / 4)); line(img, p, q, colour, 1, CV_AA); p.x = (int)(q.x + 9 * cos(angle - CV_PI / 4)); p.y = (int)(q.y + 9 * sin(angle - CV_PI / 4)); line(img, p, q, colour, 1, CV_AA); } double getOrientation(const vector<Point> &pts, Mat &img){ // 构造PCA分析使用的缓冲区 int sz = static_cast<int>(pts.size()); Mat data_pts = Mat(sz, 2, CV_64F); for (int i = 0; i < data_pts.rows; i++) { data_pts.at<double>(i, 0) = pts[i].x; data_pts.at<double>(i, 1) = pts[i].y; } // 执行PCA分析 PCA pca_analysis(data_pts, Mat(), CV_PCA_DATA_AS_ROW); // 存储对象的中心点 Point cntr = Point(static_cast<int>(pca_analysis.mean.at<double>(0, 0)), static_cast<int>(pca_analysis.mean.at<double>(0, 1))); // 存储特征值和特征向量 vector<Point2d> eigen_vecs(2); vector<double> eigen_val(2); for (int i = 0; i < 2; i++) { eigen_vecs[i] = Point2d(pca_analysis.eigenvectors.at<double>(i, 0), pca_analysis.eigenvectors.at<double>(i, 1)); eigen_val[i] = pca_analysis.eigenvalues.at<double>(i); } // 绘制主成分 circle(img, cntr, 3, Scalar(255, 0, 255), 2); Point p1 = cntr + 0.02 * Point(static_cast<int>(eigen_vecs[0].x * eigen_val[0]), static_cast<int>(eigen_vecs[0].y * eigen_val[0])); Point p2 = cntr - 0.02 * Point(static_cast<int>(eigen_vecs[1].x * eigen_val[1]), static_cast<int>(eigen_vecs[1].y * eigen_val[1])); drawAxis(img, cntr, p1, Scalar(0, 255, 0), 1); drawAxis(img, cntr, p2, Scalar(255, 255, 0), 5); double angle = atan2(eigen_vecs[0].y, eigen_vecs[0].x); // 方向(弧度) return angle; } void pca2() { Mat src = imread("E:\\1306.jpg"); //加载灰度图 Mat gray; cvtColor(src, gray, COLOR_BGR2GRAY);//转换为灰度图 Mat kernel_rect = getStructuringElement(MORPH_RECT, Size(3, 5)); // 3*5的矩形 morphologyEx(gray, gray, MORPH_OPEN, kernel_rect, Point(-1, -1), 2); //开运算2次 Mat bw; threshold(gray, bw, 50, 255, THRESH_BINARY | THRESH_OTSU);// 将图像转换为二值图像 // 查找阈值图像中的所有轮廓 vector<vector<Point> > contours; findContours(bw, contours, RETR_LIST, CHAIN_APPROX_NONE); for (size_t i = 0; i < contours.size(); i++){ double area = contourArea(contours[i]);// 计算每个轮廓的面积 if (area < 1e2 || 1e5 < area) continue;// 忽略过小或过大的轮廓 drawContours(src, contours, static_cast<int>(i), Scalar(0, 255, 0), 2);// 绘制每个轮廓,仅用于可视化 getOrientation(contours[i], src);// 查找每个形状的方向 } imshow("output", src); imwrite("E:\\output.JPG", src); }```详细解释一下代码
03-16
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昊虹AI笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值