bytedeco / javacv

Java interface to OpenCV, FFmpeg, and more
Other
7.53k stars 1.58k forks source link

mac m1 javacv-platform 1.5.8 opencv_highgui.imshow() not working #1996

Closed pigping88 closed 1 year ago

pigping88 commented 1 year ago
import org.bytedeco.javacpp.BytePointer;
import org.bytedeco.leptonica.PIX;
import org.bytedeco.opencv.global.opencv_highgui;
import org.bytedeco.opencv.global.opencv_imgcodecs;
import org.bytedeco.opencv.opencv_core.Mat;
import org.bytedeco.opencv.opencv_core.Point;
import org.bytedeco.opencv.opencv_core.Size;
import org.bytedeco.tesseract.TessBaseAPI;

import static org.bytedeco.leptonica.global.leptonica.pixDestroy;
import static org.bytedeco.leptonica.global.leptonica.pixRead;
import static org.bytedeco.opencv.global.opencv_core.*;
import static org.bytedeco.opencv.global.opencv_highgui.*;//包含了所有图形接口函数
import static org.bytedeco.opencv.global.opencv_imgcodecs.*;
import static org.bytedeco.opencv.global.opencv_imgproc.*; //COLOR_RGB2GRAY

public static void handleImg(String filePath) {
        Mat image = opencv_imgcodecs.imread(filePath); // 加载图像
        opencv_highgui.imshow("原图", image);

        //高斯滤波器(GaussianFilter)对图像进行平滑处理。
        //GaussianBlur(image, image, new Size(3, 3), 0);

        //这里可以new一个Mat来接收,也可以直接使用原来的image接收cvtColor(image, image, CV_BGRA2GRAY);
        Mat gray = new Mat();
        cvtColor(image, gray, CV_BGRA2GRAY);// 灰度化
        imshow("灰度", gray);

        //medianBlur(gray, gray, 3);  //中值滤波

        Mat bin = new Mat();
        //第三参数thresh,要根据自己的实际情况改变大小调试打印看一下。一般取100-200
        threshold(gray, bin, 90, 255, THRESH_BINARY);// 二值化
        imshow("二值化", bin);

        bitwise_not(bin, bin); // 反色,即黑色变白色,白色变黑色
        Mat corrode = new Mat();
        Mat expand = new Mat();
        Mat kelner = getStructuringElement(MORPH_RECT, new Size(3, 3), new Point(-1, -1));
        erode(bin, corrode, kelner); // 腐蚀
        dilate(corrode, expand, kelner); // 膨胀
        bitwise_not(expand, expand); // 反色,既黑色变白色,白色变黑色
        imshow("膨胀", expand);

        bitwise_not(bin, bin); // 反色,即黑色变白色,白色变黑色
        //保存二值化图像
        String imageFile = filePath + ".png";
        imwrite(imageFile, bin);

        waitKey(0);
    }

   public static void main(String[] args) {

        handleImg("xxx.jpg");

    }

Exception in thread "main" java.lang.RuntimeException: Unknown exception.
    at org.bytedeco.opencv.global.opencv_highgui.imshow(Native Method)

jdk-1.8 javacv-platform-1.5.8 mac m1-latest mac os

saudet commented 1 year ago

HighGUI only works on the first thread on Mac. You'll need to figure out how to run your JVM from the first thread.

pigping88 commented 1 year ago

Thanks a lot ! Can you say more detail about it?

saudet commented 1 year ago

That's going to be in the documentation of your JVM.

pigping88 commented 1 year ago

jdk corretto-1.8.0_362/Contents/Home/bin/java How to figure out my jvm from the first thread.

pigping88 commented 1 year ago

jvm run add the arg -XstartOnFirstThread ?

pigping88 commented 1 year ago

thank o lot , it work well.