OpenCV图像操作

canny算子

void Canny(InputArray image,OutputArray edges, double threshold1, double threshold2, int apertureSize=3,bool L2gradient=false )
https://blog.csdn.net/poem_qianmo/article/details/25560901

低于阈值1的像素点会被认为不是边缘;
高于阈值2的像素点会被认为是边缘;
在阈值1和阈值2之间的像素点,若与第2步得到的边缘像素点相邻,则被认为是边缘,否则被认为不是边缘。
https://blog.csdn.net/duwangthefirst/article/details/79971212
 

高斯滤波GaussianBlur()

void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT )

GaussianBlur(*lw, *lw, Size(r, r), 0, 0);
https://blog.csdn.net/keith_bb/article/details/54412493
 

均值滤波

    //均值滤波
    Mat dstImage;
    blur(srcImage, dstImage, Size(7, 7));
https://blog.csdn.net/qq_39660930/article/details/77575423
 

直方图均衡化、拉普拉斯、Log、Gamma

基于直方图均衡化的图像增强
https://blog.csdn.net/dcrmg/article/details/53677739
 

opencv改变图像亮度

void fun2(float alpha,float beta) {
    Mat image = imread("../seq/test1.jpg");
    if (image.empty()) {
        std::cout << "打开图像失败,请检查路径" << std::endl;
        return;
    }
    imshow("image", image);
    for(int i=0;i         for (int j = 0; j < image.cols; j++) {
            for (int k = 0; k < 3; k++) {
                int tmp= (uchar)image.at(i, j)[k] * alpha + beta;
                if (tmp > 255)
                    image.at(i, j)[k] = 2 * 255 - tmp;
                else
                    image.at(i, j)[k] = tmp;
            }
        }
    imshow("亮度增强", image);
    imwrite("../seq/亮度增强.png", image);
    waitKey();
}
https://blog.csdn.net/hutianyou123/article/details/78954444

两种常用的点过程(即点算子),是用常数对点进行 乘法 和 加法 运算:g(x) = αf(x) + β

对比度:需要通过a 、b 一起控制(仅调整a只能控制像素强度0附近的对比度,而这种做法只会导致像素强度大于0的部分更亮而已,根本看不到对比度提高的效果)
亮度:通过b控制
https://www.jianshu.com/p/88e7f7ed5f3f

https://www.jianshu.com/p/dedcbc409acd
 

双边滤波

双边滤波
cv2.bilateralFilter()能在保持边界清晰的情况下有效的去除噪音,但比较慢。
双边滤波在同时使用空间高斯权重和灰度值相似性高斯权重。空间高斯函数确保只有邻近区的像素对中心点有影响,灰度值相似性高斯函数确保只有与中心像素灰度值相近的才会被用来做模糊运算。所以能保证边界不会被模糊,因此边界处的灰度值变化比较大。

#cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)
# 9 邻域直径,两个 75 分别是空间高斯函数标准差,灰度值相似性高斯函数标准差
blur = cv2.bilateralFilter(img,9,75,75)
https://www.kancloud.cn/aollo/aolloopencv/269599
 

VideoCapture 读取视频文件,显示视频(帧)信息

// 获取视频相关信息-帧数
    long nTotalFrame = capture.get(CV_CAP_PROP_FRAME_COUNT);
    std:: cout << "nTotalFrame = " << nTotalFrame << std::endl; 
    // 获取视频相关信息-帧像素宽高 
    int  frameHeight= capture.get(CV_CAP_PROP_FRAME_HEIGHT);  
    int  frameWidth  = capture.get(CV_CAP_PROP_FRAME_WIDTH); 
    std::cout << "frameHeight = " << frameHeight << std::endl;
    std::cout << "frameWidth = " << frameWidth << std::endl;
    // 获取视频相关信息-帧率
    double FrameRate = capture.get(CV_CAP_PROP_FPS);  
    std::cout<< "FrameRate = " << FrameRate << std::endl; 
https://blog.csdn.net/Gone_HuiLin/article/details/53222288

http://blog.jobbole.com/84231/
https://www.cnblogs.com/ronny/p/opencv_road_10.html
 

Capture

OpenCV VideoCapture()函数
https://blog.csdn.net/caomin1hao/article/details/83057587
https://blog.csdn.net/hust_bochu_xuchao/article/details/52221865
 

输出视频保存格式

CV_FOURCC('P', 'I', 'M', '1') = MPEG-1 codec

CV_FOURCC('M', 'J', 'P', 'G') = motion-jpeg codec
CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec 
CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec 
CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec 
CV_FOURCC('U', '2', '6', '3') = H263 codec 
CV_FOURCC('I', '2', '6', '3') = H263I codec 
CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec
https://blog.csdn.net/yang_xian521/article/details/7440190

输出mp4用 CV_FOURCC('M', 'P', '4', '2')
 

彩色图像转为灰度图像

cv::cvtColor(src, dst, CV_BGR2GRAY);
https://blog.csdn.net/u014395105/article/details/41308979

cv::cvtColor(src, dst, cv::COLOR_BGR2RGB);
cv::cvtColor(src, dst, cv::COLOR_RGB2BGR);
 

帧差法 absdiff

Mat currentframe1,currentframe2, currentframe3, currentframe4;
            cvtColor(tempframe, currentframe, CV_BGR2GRAY);//转化为单通道灰度图,此时currentFrame已经存了tempFrame的内容 
            absdiff(currentframe,previousframe,currentframe);//做差求绝对值  
https://blog.csdn.net/yinghua2016/article/details/52651785

opencv resize

void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )
参数含义:
InputArray src     -原图像
OutputArray dst    -输出图像
Size dsize         -目标图像的大小
double fx=0        -在x轴上的缩放比例
double fy=0        -在y轴上的缩放比例

int interpolation  -插值方式,有以下四种方式
INTER_NN      -最近邻插值
INTER_LINEAR  -双线性插值 (缺省使用)
INTER_AREA    -使用象素关系重采样,当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 INTER_NN 方法。
INTER_CUBIC   -立方插值。

resize(temImage,dstImage1,Size(temImage.cols/2,temImage.rows/2),0,0,INTER_LINEAR);
https://blog.csdn.net/i_chaoren/article/details/54564663

cv::resize(image, image2X_INTER_LINEAR, cv::Size(), scale, scale, cv::INTER_LINEAR);
https://www.cnblogs.com/ybqjymy/p/12825644.html
 

PSNR

double getPSNR(const Mat& I1, const Mat& I2)
{
    Mat s1;
    absdiff(I1, I2, s1);       // |I1 - I2|AbsDiff函数是 OpenCV 中计算两个数组差的绝对值的函数
    s1.convertTo(s1, CV_32F);  // 这里我们使用的CV_32F来计算,因为8位无符号char是不能进行平方计算
    s1 = s1.mul(s1);           // |I1 - I2|^2

    Scalar s = sum(s1);         //对每一个通道进行加和

    double sse = s.val[0] + s.val[1] + s.val[2]; // sum channels

    if (sse <= 1e-10) // 对于非常小的值我们将约等于0
        return 0;
    else
    {
        double  mse = sse / (double)(I1.channels() * I1.total());//计算MSE
        double psnr = 10.0*log10((255 * 255) / mse);
        return psnr;//返回PSNR
    }
}

返回负数
https://blog.csdn.net/picway/article/details/53069372
 

SSIM

opencv实现
https://blog.csdn.net/xiaohaijiejie/article/details/47816485
https://blog.csdn.net/chaipp0607/article/details/70160307

感知哈希算法

感知哈希算法(Perceptual hash algorithm)的OpenCV实现_每一刻都是崭新的-CSDN博客




 

颜色通道的分离、合并

    cv::Mat srcImage, dst;
    std::vector channels;

    srcImage = cv::imread("D:/test/source/img/031.jpg");

    //把一个3通道图像转换为3个单通道图像,分别存储在channels[0], channels[1], channels[2]
    cv::split(srcImage, channels);  //分离色彩通道
    cv::merge(channels, dst); //合并色彩通道
https://blog.csdn.net/lql0716/article/details/55257893
 

opencv编译开imread

-DBUILD_opencv_imgcodecs=ON \
-DWITH_PNG=ON \
 

(bug) VDepth::contains(depth)

如果图像的RGB值在0-255的范围内,请确保这些值不是数据类型“float”。由于OpenCV仅在值范围为0-1时才考虑 float 。如果发现浮点值大于1,则会截断该值,并认为浮点仅存在于0-1之间。因此,产生了这样的错误。因此,如果值介于0-255之间,则将数据类型转换为uint8。
https://www.coder.work/article/2086765

代码
frame->img是Mat类型
(frame->img).convertTo(frame->img, CV_8UC3);
 

opencv 打印文字_OpenCV:在图像上显示文本信息

putText(resultMat, "errorSpace" + std::to_string(*net3OutputMap["out2"]), Point(10, 10), cv::FONT_HERSHEY_COMPLEX, 2, cv::Scalar(0, 255, 255), 2, 8, 0);

putText(image, text, origin, font_face, font_scale, cv::Scalar(0, 255, 255), thickness, 8, 0);
https://blog.csdn.net/weixin_42131367/article/details/111968642

2, cv::Scalar(0, 255, 255), 2  分别是字体大小、颜色、字体粗细

Point(10, 10) 第一个参数是第几列,第二个参数是第几行

cv::Scalar(0, 255, 255) 参数是 R G B
 

opencv在图像上画矩形框

cv::rectangle(src, rect, Scalar(255, 0, 0),1, LINE_8,0);
https://blog.csdn.net/u013925378/article/details/84109356
 

统计二值化图片白色像素点个数

//统计二值化图片白色像素点个数
//输入二值图像,返回白色像素点个数
int bSums(Mat src)
{

    int counter = 0;
    //迭代器访问像素点  
    Mat_::iterator it = src.begin();
    Mat_::iterator itend = src.end();
    for (; it != itend; ++it)
    {
        if ((*it)>0) counter += 1;//二值化后,像素点是0或者255  
    }
    return counter;
}

https://codeleading.com/article/38082455081/
 

你可能感兴趣的:(OpenCV,opencv,计算机视觉,人工智能)