C言語 OpenCVの画像処理について困っています。
Re: C言語 OpenCVの画像処理について困っています。
Forum ルールに則って問題点の短いコードを提示する必要があります。(再現出来ません...。)
[具体的にどうしたいかによって方法は千変万化します...。]
[1] 質問文
[1.1] 自分が今行いたい事は何か
[1.2] どのように取り組んだか(プログラムコードがある場合記載)
[1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
[1.4] 今何がわからないのか、知りたいのか
[2] 環境
[2.1] OS : Windows, Linux等々
[2.2] コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々
[3] その他
・どの程度C言語を理解しているか
・ライブラリを使っている場合は何を使っているか
[具体的にどうしたいかによって方法は千変万化します...。]
[1] 質問文
[1.1] 自分が今行いたい事は何か
[1.2] どのように取り組んだか(プログラムコードがある場合記載)
[1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
[1.4] 今何がわからないのか、知りたいのか
[2] 環境
[2.1] OS : Windows, Linux等々
[2.2] コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々
[3] その他
・どの程度C言語を理解しているか
・ライブラリを使っている場合は何を使っているか
Re: C言語 OpenCVの画像処理について困っています。
これは現状を報告しているだけで、質問には見えません。ぱんだ さんが書きました:C言語 OpenCVの画像処理について困っています。
OpenCVで画像内の四角形(長方形)をアーチ状の形に変形する方法で悩んでいます。
ユーザー登録していただくと、日記を投稿できるようになります。
雑談トピを立てる場合は、わかりやすいように件名の最後に[雑談]と入れるべきです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: C言語 OpenCVの画像処理について困っています。
これは大変失礼しました。
[1] 質問文
画像内の一部をアーチ状に変形させるにはどのようにすればよいですか?
[1.1] 自分が今行いたい事は何か
画像内に背景白、黒で文字や物体がある場合に黒の部分だけの外接矩形座標(minx,miny,maxx,maxy)を求め、その範囲内を逆アーチ状に変形することです。
[1.2] どのように取り組んだか(プログラムコードがある場合記載)
画像を取り込み画像内の黒い部分を調べ黒い部分のxy最小最大値を求めました。
以降どのような操作をするべきか分からない状態です。
以下は作成したコードです。
[code=Cpp]
#pragma comment(lib, "opencv_world300.lib")
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
Mat input = imread("画像ファイル.png");
int w = input.cols; // 幅
int h = input.rows; // 高さ
// デバッグ用
Mat output;
output.create(input.size(), CV_8UC3);
//
// 1. 外接矩形(minx,miny)-(maxx,maxy)を求める//
int minx = w-1;
int maxx = 0;
int miny = h-1;
int maxy = 0;
for(int y =0; y < h; y++)
for(int x =0; x < w; x++) {
const int index = (y*w+x)*3;
// 輝度i
const int i = (input.data[index+0]+input.data[index+0]+input.data[index+0])/3;
if (i<30) {
// 黒画素 debug
output.data[index+2] = 255;
output.data[index+1] = 0;
output.data[index+0] = 0;
// 最大最小の更新
if (minx > x) minx = x;
if (miny > y) miny = y;
if (maxx < x) maxx = x;
if (maxy < y) maxy = y;
}
else { // debug
output.data[index+2] = 255;
output.data[index+1] = 255;
output.data[index+0] = 255;
}
}
}
printf("%d %d %d %d\n", minx,maxx,miny,maxy);
waitKey();
return 0;
}
[/code]
[1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
4点を求めた後の変形方法が分かりません。
[1.4] 今何がわからないのか、知りたいのか
求めた4点内の範囲をアーチ状に変形する方法です。
[2] 環境
[2.1] OS : Windows
[2.2] コンパイラ名 : OpenCV C++
[3] その他
・どの程度C言語を理解しているか
学び始めて3か月程です。
[1] 質問文
画像内の一部をアーチ状に変形させるにはどのようにすればよいですか?
[1.1] 自分が今行いたい事は何か
画像内に背景白、黒で文字や物体がある場合に黒の部分だけの外接矩形座標(minx,miny,maxx,maxy)を求め、その範囲内を逆アーチ状に変形することです。
[1.2] どのように取り組んだか(プログラムコードがある場合記載)
画像を取り込み画像内の黒い部分を調べ黒い部分のxy最小最大値を求めました。
以降どのような操作をするべきか分からない状態です。
以下は作成したコードです。
[code=Cpp]
#pragma comment(lib, "opencv_world300.lib")
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
Mat input = imread("画像ファイル.png");
int w = input.cols; // 幅
int h = input.rows; // 高さ
// デバッグ用
Mat output;
output.create(input.size(), CV_8UC3);
//
// 1. 外接矩形(minx,miny)-(maxx,maxy)を求める//
int minx = w-1;
int maxx = 0;
int miny = h-1;
int maxy = 0;
for(int y =0; y < h; y++)
for(int x =0; x < w; x++) {
const int index = (y*w+x)*3;
// 輝度i
const int i = (input.data[index+0]+input.data[index+0]+input.data[index+0])/3;
if (i<30) {
// 黒画素 debug
output.data[index+2] = 255;
output.data[index+1] = 0;
output.data[index+0] = 0;
// 最大最小の更新
if (minx > x) minx = x;
if (miny > y) miny = y;
if (maxx < x) maxx = x;
if (maxy < y) maxy = y;
}
else { // debug
output.data[index+2] = 255;
output.data[index+1] = 255;
output.data[index+0] = 255;
}
}
}
printf("%d %d %d %d\n", minx,maxx,miny,maxy);
waitKey();
return 0;
}
[/code]
[1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
4点を求めた後の変形方法が分かりません。
[1.4] 今何がわからないのか、知りたいのか
求めた4点内の範囲をアーチ状に変形する方法です。
[2] 環境
[2.1] OS : Windows
[2.2] コンパイラ名 : OpenCV C++
[3] その他
・どの程度C言語を理解しているか
学び始めて3か月程です。
Re: C言語 OpenCVの画像処理について困っています。
引用してそのままプレビューしたらハイライトが効いたので、タグ自体は正しいようですね。C6b14 さんが書きました:コードは”「code」「code」”で囲むこと(albumのうえのコードボタン使用)。
codeタグで囲んでもBBCodeを無効にしてしまうと意味がないので、無効にしてはいけません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: C言語 OpenCVの画像処理について困っています。
少なくとも、C6b14 さんが書きました:いまみたらコンパイルすらできない。
- あってはいけない場所に全角スペースがある
- {に対応していない}がある (for(int y =0; y < h; y++) の後に{があるべき?)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: C言語 OpenCVの画像処理について困っています。
その2か所を訂正してエラーはなくなりました。ビルド時にVersinが違うと思われる(.hppのエラーがたくさん出た)現象があります。OpenCV3.1です。OpenCVはVersinが違うと動かないことが多いです。
Re: C言語 OpenCVの画像処理について困っています。
ここhttp://opencv.jp/cookbook/opencv_img.html#id20にある”外接矩形”は動きます。
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
int
main(int argc, char *argv[])
{
cv::Size img_size(500, 500);
cv::Mat img = cv::Mat::zeros(img_size, CV_8UC3);
// 一様分布乱数で座標を生成
const int rand_num = 50;
cv::Mat_<int> points(rand_num, 2);
cv::randu(points, cv::Scalar(100), cv::Scalar(400));
for (int i = 0; i<rand_num; ++i) {
// 座標に点を描画
cv::circle(img, cv::Point(points(i, 0), points(i, 1)), 2, cv::Scalar(200, 200, 0), -1, CV_AA);
}
// CV_*C2型のMatに変換してから,外接矩形を計算
cv::Rect brect = cv::boundingRect(cv::Mat(points).reshape(2));
// 外接矩形を描画
cv::rectangle(img, brect.tl(), brect.br(), cv::Scalar(100, 100, 200), 2, CV_AA);
cv::namedWindow("image", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);
cv::imshow("image", img);
cv::waitKey(0);
}
Re: C言語 OpenCVの画像処理について困っています。
[雑談](VisualStudioの”ソリューションのNuGetパッケージの管理”を使えば何もしなくても全自動でOpenCVのインストール/ アンインストールが繰り返しできます。)Versinがの変更の可能だと思うのですが。
Re: C言語 OpenCVの画像処理について困っています。
「コード」は送ってもらはなくていいです。
//#pragma comment(lib, "opencv_world300.lib")<ー:コメントアウト
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <cstdio>
#include <cstring>
//#include <stdio.h>
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
Mat input = imread("画像ファイル.png");
int w = input.cols; // 幅
int h = input.rows; // 高さ
// デバッグ用
Mat output;
output.create(input.size(), CV_8UC3);
//
// 1. 外接矩形(minx,miny)-(maxx,maxy)を求める//
int minx = w - 1;
int maxx = 0;
int miny = h - 1;
int maxy = 0;
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
const int index = (y*w + x) * 3;
// 輝度i
const int i = (input.data[index + 0] + input.data[index + 0] + input.data[index + 0]) / 3;
if (i < 30) {
// 黒画素 debug
output.data[index + 2] = 255;
output.data[index + 1] = 0;
output.data[index + 0] = 0;
// 最大最小の更新
if (minx > x) minx = x;
if (miny > y) miny = y;
if (maxx < x) maxx = x;
if (maxy < y) maxy = y;
}
else { // debug
output.data[index + 2] = 255;
output.data[index + 1] = 255;
output.data[index + 0] = 255;
}
}
}
printf("%d %d %d %d\n", minx, maxx, miny, maxy);
waitKey();
return 0;
}
Re: C言語 OpenCVの画像処理について困っています。
ここhttp://opencv.jp/cookbook/opencv_img.htmlある画像でいいなら指定してくだされば取り込みますよ。
Re: C言語 OpenCVの画像処理について困っています。
画像も他もいらないですよ。”四角形(長方形)をアーチ状の形に変形する方法”が具体的になにをもとにどんな風にやりたいかを説明頂ければいいと思います。
Re: C言語 OpenCVの画像処理について困っています。
自分が書いたコード自体も問題だらけだったみたいですね。
申し訳ないです。
実現したい画像変形は具体的にはアーチ状(曲がった)物体の修正です。
画像内のアーチ状の文字や絵を外接矩形で囲み逆方向に曲げてやれば元の物体をまっすぐに修正できるのではないかと考えプログラムしています。
例としてはWordなどでできる文字の効果「上アーチ」または「下アーチ」を元の横一直線文字に戻すような変形がしたいのです。
申し訳ないです。
実現したい画像変形は具体的にはアーチ状(曲がった)物体の修正です。
画像内のアーチ状の文字や絵を外接矩形で囲み逆方向に曲げてやれば元の物体をまっすぐに修正できるのではないかと考えプログラムしています。
例としてはWordなどでできる文字の効果「上アーチ」または「下アーチ」を元の横一直線文字に戻すような変形がしたいのです。
Re: C言語 OpenCVの画像処理について困っています。
Wordのその機能はよく使いますがプログラムで実装するには高度な数学の知識もいるしアルゴリズムも大変です。なにか具体的な目的についての方法論であれば良いのですが抽象論的すぎます。
Re: C言語 OpenCVの画像処理について困っています。
そういえばたしかにOpenCVで”矩形領域をマウスのドラッグで変形”させてました。似ているので参考にはなるかもしれません。
http://dixq.net/forum/viewtopic.php?f=3&t=18570
http://dixq.net/forum/viewtopic.php?f=3&t=18570
Re: C言語 OpenCVの画像処理について困っています。
やりたいことはcvLogPolar()みたいなことでしょうか.