## OpenCV 项目


### [模糊检测原理](https://pyimagesearch.com/2015/09/07/blur-detection-with-opencv/)
整个算法的原理和拉普拉斯算子本身的定义有关，该算子主要用来测量图像的二阶导数。它强调了包含快速强度变化的图像区域。拉普拉斯算子经常被用来做边缘检测。这里存在着一个假设，即如果一个图像中包含着高方差，那么在图像中会有较大范围的响应，包括边缘和非边缘，这代表着一张正常图像。但是如果该图像的方差很低，那么响应的范围很小，这表明图像中的边缘很小。众所周知的是当图像越模糊时，包含的边缘信息就会越少

实现步骤:
 - 步骤1-读取输入图片；
 - 步骤2-输入图片灰度化；
 - 步骤3-与特定的Laplacian核进行卷积；
 - 步骤4-计算响应的方差值；
 - 步骤5-如果当前的方差值<threshold，则该图片为模糊图片，否则不是模糊图片。


### 如何编译该项目
**必须安装的环境**
1. 配置 `JAVA_HOME` 环境变量
2. 安装 opencv 4.5.5
3. 编译 PQCVMedia Java JNI API 调用动态库
   
    ```shell
    git clone https://git.yishihui.com/VideoProcessing/PQCVMedia.git

    cd PQCVMedia

    ./build.sh

    echo "安装成功，在当前 output/lib 下"

    ```



#### Linux：

**配置 JAVA_HOME 环境变量**

```shell
export JAVA_HOME=xxx
```

**命令安装 必须 4.5.5 版本(不推荐)**

```shell
sudo yum install src src-devel

#检查版本
pkg-config --modversion src
```

**源码安装 4.5.5(推荐)**

```shell
#src 环境 4.5.5
#安装依赖包
sudo yum install freeglut-devel mesa-libGL mesa-libGL-devel  boost boost-thread boost-devel libv4l-devel libjpeg-turbo-devel libtiff-devel  libdc1394-devel tbb-devel eigen3-devel gstreamer-plugins-base-devel python-devel numpy python34-numpy gtk2-devel libpng-devel jasper-devel openexr-devel libwebp-devel python3 python3-devel python3-pip  python3-devel python3-numpy
#下载 OpenCV 源码 

wget -O src-4.5.5.zip         https://github.com/opencv/opencv/archive/refs/tags/4.5.5.zip
wget -O opencv_contrib-4.5.5.zip https://github.com/opencv/opencv_contrib/archive/refs/tags/4.5.5.zip
unzip src-4.5.5.zip
unzip opencv_contrib-4.5.5.zip

cd src-4.5.5
mkdir build && cd build

OPENCV_CONTRIB_DIR=/root/src/opencv_contrib-4.5.5/modules

cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_C_EXAMPLES=ON \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D OPENCV_GENERATE_PKGCONFIG=ON \
    -D OPENCV_EXTRA_MODULES_PATH="${OPENCV_CONTRIB_DIR}" \
    -D BUILD_EXAMPLES=ON ..

#使用 8cpu 编译并安装    
make -j8 && make install    
 

```

#### MAC：
**命令安装**
```shell
brew install src
```
如果安装慢可以换一个源:
```shell
cd "$(brew --repo)"  
git remote set-url origin https://mirrors.aliyun.com/homebrew/brew.git
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin https://mirrors.aliyun.com/homebrew/homebrew-core.git
echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.aliyun.com/homebrew/homebrew-bottles' >> ~/.bash_profile
source ~/.bash_profile
```

### 如何使用?
#### java

**将 SDK copy 至你的项目**
```shell
 cp PQCVMedia/output/jar/libpq-cv-media.jar         你的项目目录
 cp PQCVMedia/output/lib/libpiaoquan_java_opencv.so 你的项目目录
```

**1、初始化 SDK**
```java
PQCVMediaProcessor.initSDK("/root/libpiaoquan_java_opencv.so");
```

**2、以 bytes 流形式传递**
```java
PQCVMediaProcessor.blurDetectionFromImageBytes(byte[] data)

```


**2、以 path 绝对路径形式传递**
```java
PQCVMediaProcessor.blurDetectionFromImagePath(String path);

```


### 获取视频指纹码，用于比较是否相似

#### 环境配置

1. FFmpeg 安装 >=4.4.1 (建议 4.4.1)
```shell


   yum-config-manager --add-repo=https://negativo17.org/repos/epel-multimedia.repo
   
   yum-config-manager --disable epel-multimedia
   
   yum install --enablerepo=epel-multimedia ffmpeg ffmpeg-devel
   

```


2. OpenCV 安装 (参考上面)
   
3. JAVA   安装 (参考上面)
   
4. 代码地址

```shell
git clone https://git.yishihui.com/VideoProcessing/PQCVMedia.git

cd PQCVMedia

git checkout ffmpeg-opencv

./build.sh

echo "安装成功，在当前 output/lib 下"
```

#### api

**inputjson:**

strartTimeMs,endTimeMs 时间建议传递 8 段，每段为 1s,比如视频时长 100min,去掉前面 10%，尾部 10%，然后需要中间的 80% 做检查，每隔 10 分钟截取 1s 即可。

```json

{
   "videoPath": "\"xxx.mp4\"",
   "clips": [
      {
         "strartTimeMs": 10*60*1000,//10 分钟
         "endTimeMs": 10*60*1000 + 1000,//10分1秒
         "hashs": [ //结果返回 start -> end 每张图片 标识用于比较
            {
               "imageHash": "\"000010000101010010101010\"",
               "hashSize": 64,
               "pts": 0
            },
            {
               "imageHash": "\"000010000101010010101010\"",
               "hashSize": 64,
               "pts": 40
            }
         ]
      }
   ]
}

```

```java

PQCVMediaProcessor.java
static String getVideoSimilarityLists(String inputjson)


```

比较参考
imageHash 每个字符串中的字符比较，如果对应位置上一样，即为相似,
如果有 10 帧图像，其中经过比较有 5 张图片相似，那么他们的相似值为 50%

```c

float fingerprint_compare(const char *arr,const char *arr2, int len) {
    int size = len;
    int sim_sum = 0;
    for (int i = 0; i < size; ++i) {
        if (arr[i] == arr2[i])
            sim_sum++;
    }
    return sim_sum * 1.0 / size;
}

```



