DevYK il y a 3 ans
Parent
commit
357325b13a
3 fichiers modifiés avec 51 ajouts et 15 suppressions
  1. 2 0
      CMakeLists.txt
  2. 48 15
      src/opencv/image_fingerprint.cpp
  3. 1 0
      src/opencv/image_fingerprint.h

+ 2 - 0
CMakeLists.txt

@@ -201,6 +201,8 @@ else ()
     message("else:${CMAKE_BUILD_TYPE}")
     message("else:${CMAKE_C_FLAGS_RELEASE}")
 endif ()
+
+
 target_link_libraries(piaoquan_java_opencv -lpthread
         ${FFmpeg_LIBS}
         ${OpenCV_LIBS}

+ 48 - 15
src/opencv/image_fingerprint.cpp

@@ -41,15 +41,6 @@ int fingerprintFromFFAVFrame(FILE *file, AVFrame *frame, char buf[64]) {
     if (file) fprintf(file, "fingerprintFromFFAVFrame\n");
     if (!frame)return NULL;
 
-//    if (1) {
-//        memset((void *)buf, 0,sizeof(char) * 8 * 8);
-//        for (int i = 0; i <64 ; ++i) {
-//            buf[i] = 1;
-//        }
-//        return 64;
-//    }
-
-//    auto img = avframeToCvmat(frame);
     int width = frame->width;
     int height = frame->height;
     cv::Mat img(height, width, CV_8UC3);
@@ -67,14 +58,15 @@ int fingerprintFromFFAVFrame(FILE *file, AVFrame *frame, char buf[64]) {
 //    std::string str = frame->pts + "";
 //    imshow(str, img);
     int scale_width = 8, scale_height = 8;
-    Mat gray, res;
+    cv::Mat gray, res;
     if (file) fprintf(file, "fingerprintFromFFAVFrame 3\n");
     //缩放成8x8大小灰度图
     resize(img, res, Size(scale_width, scale_height));
     if (file) fprintf(file, "fingerprintFromFFAVFrame 4\n");
     cvtColor(res, gray, COLOR_BGR2GRAY);
     if (file) fprintf(file, "fingerprintFromFFAVFrame 5\n");
-    Mat mat_mean, mat_stddev;
+    //获取灰度平均值
+    cv::Mat mat_mean, mat_stddev;
     meanStdDev(gray, mat_mean, mat_stddev);//求灰度图像的均值、均方差
     double mn = 0;
     if (!mat_mean.empty()) {
@@ -83,10 +75,50 @@ int fingerprintFromFFAVFrame(FILE *file, AVFrame *frame, char buf[64]) {
         printf("灰度平均值 empty!\n");
         return -1;
     };
-    //获取灰度平均值
-//     mn = mean(gray)[0];
     if (file) fprintf(file, "fingerprintFromFFAVFrame 6\n");
+    if (gray.cols * gray.rows < scale_height * scale_width)return NULL;
+//    //得到图像指纹值
+    for (int i = 0; i < 8; i++) {
+        for (int j = 0; j < 8; j++) {
+            buf[i * 8 + j] = (gray.at<unsigned char>(i, j) > mn) ? 1 : 0;
+        }
+    }
     if (file) fprintf(file, "fingerprintFromFFAVFrame 7\n");
+    return scale_width * scale_height;
+}
+int fingerprintFromFFAVFrameV2(FILE *file, AVFrame *frame, char buf[64]) {
+    if (file) fprintf(file, "fingerprintFromFFAVFrame\n");
+    if (!frame)return NULL;
+
+    int width = frame->width;
+    int height = frame->height;
+    cv::Mat img(height, width, CV_8UC3);
+    int cvLinesizes[1];
+    cvLinesizes[0] = img.step1();
+    SwsContext *conversion = sws_getContext(width, height, (AVPixelFormat) frame->format, width, height,
+                                            AVPixelFormat::AV_PIX_FMT_BGR24, SWS_FAST_BILINEAR, NULL, NULL, NULL);
+    sws_scale(conversion, frame->data, frame->linesize, 0, height, &img.data, cvLinesizes);
+    sws_freeContext(conversion);
+    if (img.empty()) {
+        printf("image is empty.");
+        return NULL;
+    }
+    int scale_width = 8, scale_height = 8;
+    cv::Mat gray, res;
+    cvtColor(img, gray, COLOR_BGR2GRAY);
+    //缩放成8x8大小灰度图
+    resize(gray, gray, Size(scale_width, scale_height));
+
+    //获取灰度平均值
+    cv::Mat mat_mean, mat_stddev;
+    meanStdDev(gray, mat_mean, mat_stddev);//求灰度图像的均值、均方差
+    double mn = 0;
+    if (!mat_mean.empty()) {
+        mn = mat_mean.at<double>(0, 0);
+    } else {
+        printf("灰度平均值 empty!\n");
+        return -1;
+    };
     if (gray.cols * gray.rows < scale_height * scale_width)return NULL;
 //    //得到图像指纹值
     for (int i = 0; i < 8; i++) {
@@ -94,11 +126,12 @@ int fingerprintFromFFAVFrame(FILE *file, AVFrame *frame, char buf[64]) {
             buf[i * 8 + j] = (gray.at<unsigned char>(i, j) > mn) ? 1 : 0;
         }
     }
-    if (file) fprintf(file, "fingerprintFromFFAVFrame 8\n");
-    if (file) fprintf(file, "fingerprintFromFFAVFrame 9\n");
+    if (file) fprintf(file, "fingerprintFromFFAVFrame 7\n");
     return scale_width * scale_height;
 }
 
+
+
 float fingerprint_compare(const char *arr, const char *arr2, int len) {
     int size = len;
     int sim_sum = 0;

+ 1 - 0
src/opencv/image_fingerprint.h

@@ -24,6 +24,7 @@ AVFrame* cvmatToAvframe(cv::Mat* image, AVFrame * frame);
 
 
 int fingerprintFromFFAVFrame(FILE *file,AVFrame *frame,char image_hash[64]);
+int fingerprintFromFFAVFrameV2(FILE *file,AVFrame *frame,char image_hash[64]);
 
 /**
  * 指纹相识度