Я работаю с 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](https://i.stack.imgur.com/ooCJE.png)