Выпуск OpenCV Hough Line - PullRequest
       19

Выпуск OpenCV Hough Line

0 голосов
/ 26 марта 2020

Я работаю с openCV и пытаюсь выяснить, как преобразованы линии Хафа, чтобы очертить потенциальные объекты изображения. В настоящее время я могу применить цветовой фильтр, чтобы получить указанное c изображение, которое я хочу, и затем хочу применить преобразования грубой линии, чтобы наметить возможные объекты для обнаружения, однако я не могу найти какие-либо грубые линии. Это начальная функция обработки изображения, чтобы получить растровое изображение с указанным c диапазоном цветов:

    /**
     * Process bitmap with supplied filters.
     *
     * @param bitmap    Bitmap to process.
     * @param lowerHue  Lower filter range.
     * @param upperHue  Upper filter range.
     */
    private fun processBitmap(bitmap: Bitmap, lowerHue: RGBData, upperHue: RGBData): Bitmap {
        val mat = Mat(bitmap.width, bitmap.height, CvType.CV_8UC3)
        Utils.bitmapToMat(bitmap, mat)

        val hsvImage = Mat()
        Imgproc.cvtColor(mat, hsvImage, Imgproc.COLOR_BGR2HSV, 3)

        val filteredDestination = Mat()
        Core.inRange(
            hsvImage,
            mapper.rgbToScalarBGR(lowerHue),
            mapper.rgbToScalarBGR(upperHue),
            filteredDestination
        )

        return convertMapToBitmap(filteredDestination)
    }

    /**
     * Helper function to convert modified mat to a displayed bitmap resource.
     *
     * @param filteredDestination   Mat to be converted.
     */
    private fun convertMapToBitmap(filteredDestination: Mat): Bitmap {
        val mRgba = Mat()
        Imgproc.cvtColor(filteredDestination, mRgba, Imgproc.COLOR_GRAY2BGR, 0)
        val mRgba2 = Mat()
        Imgproc.cvtColor(mRgba, mRgba2, Imgproc.COLOR_BGR2RGBA, 0)
        val bmp =
            Bitmap.createBitmap(mRgba2.cols(), mRgba2.rows(), Bitmap.Config.ARGB_8888)

        Utils.matToBitmap(mRgba2, bmp)
        return bmp.copy(Bitmap.Config.ARGB_8888, true)
    }

И затем я пытаюсь обработать растровое изображение, применяя преобразование грубой линии:

/**
     * Edge detection via hough line transformation.
     * Example taken from <a>https://docs.opencv.org/3.4/d9/db0/tutorial_hough_lines.html</a>
     *
     * @param bitmap    Bitmap to be transformed.
     */
    private fun houghLineTransformations(bitmap: Bitmap): Bitmap {
        val mat = Mat(bitmap.width, bitmap.height, CvType.CV_8UC3)
        val gray = Mat()
        val edges = Mat()
        val lines = Mat()

        Utils.bitmapToMat(bitmap, mat)
        Imgproc.cvtColor(mat, gray, Imgproc.COLOR_BGR2GRAY)
        Imgproc.Canny(gray, edges, 50.0, 150.0)

        val threshold = 100
        val minLineSize = 100.0
        val lineGap = 50.0

        Imgproc.HoughLinesP(edges, lines, 1.0, Math.PI / 180, threshold, minLineSize, lineGap)

        val filteredDestination = Mat(bitmap.width, bitmap.height, CvType.CV_8UC3)
        for (x in 0 until lines.cols()) {
            val vec = lines[0, x]
            val x1 = vec[0]
            val y1 = vec[1]
            val x2 = vec[2]
            val y2 = vec[3]
            val start = Point(x1, y1)
            val end = Point(x2, y2)
            Imgproc.line(filteredDestination, start, end, Scalar(255.0, 0.0, 0.0), 3)
        }

//        return convertMapToBitmap(filteredDestination)

        val bmp =
            Bitmap.createBitmap(mat.cols(), mat.rows(), Bitmap.Config.ARGB_8888)

        Utils.matToBitmap(filteredDestination, bmp)
        return bmp.copy(Bitmap.Config.ARGB_8888, true)
    }

Это журнал ошибок:

2020-03-26 12:13:41.179 18931-18931/com.uhp.fsdzs.nonproduction W/System.err: CvException [org.opencv.core.CvException: /Volumes/Linux/builds/master_pack-android/opencv/modules/java/generator/src/cpp/utils.cpp:97: error: (-215) src.dims == 2 && info.height == (uint32_t)src.rows && info.width == (uint32_t)src.cols in function void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, jclass, jlong, jobject, jboolean)
2020-03-26 12:13:41.180 18931-18931/com.uhp.fsdzs.nonproduction W/System.err: ]
2020-03-26 12:13:41.180 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at org.opencv.android.Utils.nMatToBitmap2(Native Method)
2020-03-26 12:13:41.180 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at org.opencv.android.Utils.matToBitmap(Utils.java:123)
2020-03-26 12:13:41.180 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at org.opencv.android.Utils.matToBitmap(Utils.java:132)
2020-03-26 12:13:41.180 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at com.uhp.fsdzs.viewmodels.ScanViewModel.houghLineTransformations(ScanViewModel.kt:208)
2020-03-26 12:13:41.180 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at com.uhp.fsdzs.viewmodels.ScanViewModel.processErrorImage(ScanViewModel.kt:135)
2020-03-26 12:13:41.180 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at com.uhp.fsdzs.viewmodels.ScanViewModel.access$processErrorImage(ScanViewModel.kt:32)
2020-03-26 12:13:41.180 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at com.uhp.fsdzs.viewmodels.ScanViewModel$processBitmap$1.invokeSuspend(ScanViewModel.kt:87)
2020-03-26 12:13:41.180 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at com.uhp.fsdzs.viewmodels.ScanViewModel$processBitmap$1.invoke(Unknown Source:10)
2020-03-26 12:13:41.180 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at com.uhp.fsdzs.common.base.BaseViewModel$suspendCall$1.invokeSuspend(BaseViewModel.kt:65)
2020-03-26 12:13:41.180 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
2020-03-26 12:13:41.180 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at kotlinx.coroutines.DispatchedContinuationKt.resumeCancellableWith(DispatchedContinuation.kt:313)
2020-03-26 12:13:41.180 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:26)
2020-03-26 12:13:41.180 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:109)
2020-03-26 12:13:41.180 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:158)
2020-03-26 12:13:41.181 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders.common.kt:54)
2020-03-26 12:13:41.181 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at kotlinx.coroutines.BuildersKt.launch(Unknown Source:1)
2020-03-26 12:13:41.181 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch$default(Builders.common.kt:47)
2020-03-26 12:13:41.181 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at kotlinx.coroutines.BuildersKt.launch$default(Unknown Source:1)
2020-03-26 12:13:41.182 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at com.uhp.fsdzs.common.base.BaseViewModel.suspendCall(BaseViewModel.kt:62)
2020-03-26 12:13:41.182 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at com.uhp.fsdzs.common.base.BaseViewModel.suspendCall$default(BaseViewModel.kt:59)
2020-03-26 12:13:41.182 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at com.uhp.fsdzs.viewmodels.ScanViewModel.processBitmap(ScanViewModel.kt:86)
2020-03-26 12:13:41.182 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at com.uhp.fsdzs.ui.fragments.ScanResultsFragment.colorRecognition(ScanResultsFragment.kt:87)
2020-03-26 12:13:41.182 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at com.uhp.fsdzs.ui.fragments.ScanResultsFragment.onViewCreated(ScanResultsFragment.kt:60)
2020-03-26 12:13:41.182 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:332)
2020-03-26 12:13:41.182 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187)
2020-03-26 12:13:41.182 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2224)
2020-03-26 12:13:41.182 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1997)
2020-03-26 12:13:41.182 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1953)
2020-03-26 12:13:41.182 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849)
2020-03-26 12:13:41.182 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413)
2020-03-26 12:13:41.182 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at android.os.Handler.handleCallback(Handler.java:873)
2020-03-26 12:13:41.182 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:99)
2020-03-26 12:13:41.183 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at android.os.Looper.loop(Looper.java:193)
2020-03-26 12:13:41.183 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6669)
2020-03-26 12:13:41.183 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
2020-03-26 12:13:41.183 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
2020-03-26 12:13:41.183 18931-18931/com.uhp.fsdzs.nonproduction W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

Однако это говорит мне о том, что размеры мата и растрового изображения не совпадают, когда выполняется окончательное преобразование matToBitmap. Когда я пробую разные варианты, я получу, что размеры не могут быть 0. Поэтому я бью стену. Мой вопрос будет таким: как получить грубые преобразования линий из растрового изображения в градациях серого после успешного применения цветного фильтра, или, пожалуйста, укажите, что я делаю неправильно?

РЕДАКТИРОВАТЬ добавленное изображение исходного изображения и цвета фильтрация, после которой должно произойти преобразование грубой линии, и для фильтрации используются следующие оценки оттенков. Нижний оттенок RGB 160,0,30 Верхний оттенок RGB 255, 100, 100

enter image description here

...