- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用开放式 cv 库为 android 创建过滤器,但它显示匿名结果我附上了我的完整代码和快照。
结果图像如下:
原图是这样的:
过滤器正在工作,但黑线不是我想要创建的结果。
Xml 代码是:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:opencv="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="10dp"
android:layout_height="10dp" />
<ImageView
android:id="@+id/imageView2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:layout_centerVertical="true" />
</RelativeLayout>
主事件.java
private native int filter(int width, int height, int [] mPhotoIntArray,int [] nPhotoIntArray, int [] mCannyOutArray);
static {
System.loadLibrary("opencv");
}
ImageView img1;
ImageView img2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img1=(ImageView) findViewById(R.id.imageView1);
img2=(ImageView) findViewById(R.id.imageView2);
InputStream is;
is = this.getResources().openRawResource(R.drawable.filter_image);
Bitmap bmInImg = BitmapFactory.decodeStream(is);
int [] mPhotoIntArray;
int [] nPhotoIntArray;
int [] mCannyOutArray;
mPhotoIntArray = new int[bmInImg.getWidth() * bmInImg.getHeight()];
// Copy pixel data from the Bitmap into the 'intArray' array
bmInImg.getPixels(mPhotoIntArray, 0, bmInImg.getWidth(), 0, 0, bmInImg.getWidth(), bmInImg.getHeight());
// create dummy buffer
nPhotoIntArray = new int[bmInImg.getWidth() * bmInImg.getHeight()];
//create result buffer
mCannyOutArray = new int[bmInImg.getWidth() * bmInImg.getHeight()];
filter(bmInImg.getHeight(), bmInImg.getWidth(), mPhotoIntArray, nPhotoIntArray,mCannyOutArray);
//
// Convert the result to Bitmap
//
Bitmap bmOutImg = Bitmap.createBitmap(bmInImg.getWidth(), bmInImg.getHeight(), Config.ARGB_8888);
bmOutImg.setPixels(mCannyOutArray, 0, bmInImg.getWidth(), 0, 0, bmInImg.getWidth(), bmInImg.getHeight());
storeImage(bmOutImg, "Filter.PNG");
img2.setImageBitmap(bmOutImg);
}
OpenCvFilters.cpp
#include <jni.h>
#include <stdio.h>
#include "opencv2/core/core.hpp"
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
void blending_Lighten(Mat&img,Mat&ing, Mat &out);
extern "C" {
JNIEXPORT jint JNICALL Java_com_example_opencvfilters_MainActivity_filter(
JNIEnv* env, jobject, jint width, jint height, jintArray in,jintArray inn,
jintArray out) {
jint* _in = env->GetIntArrayElements(in, 0);
jint* _inn = env->GetIntArrayElements(inn, 0);
jint* _out = env->GetIntArrayElements(out, 0);
Mat mSrc(height, width, CV_8UC4, (unsigned char*) _in); // for input image
Mat nSrc(height, width, CV_8UC4, (unsigned char*) _inn);
Mat bgra(height, width, CV_8UC4, (unsigned char*) _out);
blending_Lighten(mSrc,nSrc, bgra);
jint retVal;
int ret = 1;
retVal = jint(retVal);
return retVal;
}
}
void blending_Lighten(Mat& img1, Mat& img2, Mat& out)
{
cv::Mat result(img1.size(), CV_32FC4); // result image is same size of input image
// Img2 is the value of solid colors
img2 = Mat(img1.size(), img1.type());
vector<Mat> colors;
split(img2, colors);//bgra
colors[0] = 186;
colors[1] = 44;
colors[2] = 28;
merge(colors, img2);
// Iterate through rows , cols and colors(image channels)
for (int i = 0; i < img1.rows; ++i){
for (int j = 0; j < img1.cols; ++j){
for (int c = 0; c<img1.channels(); c++){ // Iterate through colors
//uchar target = img1.at<uchar>(i, 3*j+c);
//uchar blend = img2.at<uchar>(i, 3*j+c);
//Formula for lighten blending
float target = float(img1.at<uchar>(i, 3 * j + c)) / 255.;
float blend = float(img2.at<uchar>(i, 3 * j + c)) / 255.;
result.at<float>(i, 3 * j + c) = max(target, blend);
}
}
}
result.convertTo(out, CV_8UC4, 255);
}
这是我完整的工作代码,我只想删除图像上的黑色衬里。
最佳答案
您的图像是四 channel 的。这意味着您的索引是错误的。在 blending_Lighten()
float target = float(img1.at<uchar>(i, 3 * j + c)) / 255.;
float blend = float(img2.at<uchar>(i, 3 * j + c)) / 255.;
result.at<float>(i, 3 * j + c) = max(target, blend);
应该是
float target = float(img1.at<uchar>(i, 4 * j + c)) / 255.;
float blend = float(img2.at<uchar>(i, 4 * j + c)) / 255.;
result.at<float>(i, 4 * j + c) = max(target, blend);
顺便说一句,您没有设置颜色的 alpha channel 。
而且,似乎blending_Lighten()
可以大大简化:
void blending_Lighten(Mat& img1, Mat& img2, Mat& out)
{
img2 = Mat(img1.size(), img1.type(), Scalar(186, 44, 28, 0));
max(img1, img2, out);
}
最后,在从 Java_com_example_opencvfilters_MainActivity_filter()
返回之前, 你应该调用 env->ReleaseIntArrayElements()
对于所有你调用 GetIntArrayElements()
的事情.
关于c++ - Opencv 过滤器结果图像上有黑色衬里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25218438/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!