#include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace cv; Mat src,dst; bool YN=0; //记录是否已经按下鼠标左键 //函数声明 void RegionGrow(Point point,Mat &src,Mat &dst); void on_mouse( int event, int x, int y, int flags, void * ustc); int main() { src=imread("E:\\图片\\VC\\gray_cells.BMP",0); namedWindow("src",1); imshow( "src", src ); setMouseCallback( "src", on_mouse, 0 ); waitKey(0); return 0; } void RegionGrow(Point point,Mat &src,Mat &dst) { dst=src.clone(); uchar* p_data=dst.data; // 图像每行像素所占的字节数 int nLineByte = dst.cols; // 图像的宽度 int nWidth =dst.cols; // 图像的高度 int nHeight =dst.rows; // 计算种子点的灰度值 int nSeedPoint = *(p_data + (nHeight - point.y) * nLineByte + point.x); // 对各个像素进行灰度转换 for (int j = 0; j < nHeight; j ++) for (int i = 0; i < nWidth; i ++) { //当前像素点的灰度值 int nTemp = *(p_data + nLineByte * j + i); //如果当前点与种子点的灰度值之差的绝对值大于阈值10,则将该点置为255 if ( abs(nTemp - nSeedPoint) > 10 ) *(p_data + nLineByte * j + i) = 255; } } void on_mouse( int event, int x, int y, int flags, void * ustc) { Point pt; if (event == CV_EVENT_LBUTTONDOWN) { if( !YN ) { pt.x=x; pt.y=y; circle( src, pt, 2,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 ); imshow( "src", src ); cout<<pt<<endl; YN=1; RegionGrow(pt,src,dst); imshow("dst",dst); } } }
区域生长(用鼠标选择一个点进行生长)
最新推荐文章于 2024-09-12 11:11:48 发布